2011-04-05 13 views
8

मैं Moq उपयोग कर रहा हूँ नकली कैसे और मैं निम्नलिखित इंटरफेस है:एक अंतरफलक है कि फैली IEnumerable

public interface IGameBoard : IEnumerable<PieceType> 
{ 
    ... 
} 
public class GameBoardNodeFactory 
{ 
    public virtual GameBoardNode Create (int row, int column, IGameBoard gameBoard) 
    { 
     ... 
    } 
} 

तो मैं इस तरह एक परीक्षण है:

var clonedGameBoardMock = new Mock<IGameBoard> (MockBehavior.Loose); 
var gameBoardNodeFactoryMock = new Mock<GameBoardNodeFactory>(); 
gameBoardNodeFactoryMock.Setup (x => 
    x.Create (
     position.Row, 
     position.Column, 
     clonedGameBoardMock.Object)).Returns (new GameBoardNode { Row = position.Row, Column = position.Column }); 

लेकिन तब gameBoardNodeFactoryMock.Object बनाएँ। (स्थिति। पंक्ति, स्थिति। कॉलम, clonedGameBoardMock.Object) एक NullReferenceException फेंकता है। मैंने IGameBoard के लिए एक नकली बनाने की कोशिश की, जैसे कि यह IENumerable <PieceType> इंटरफ़ेस का विस्तार नहीं करता है और फिर यह काम करता है।

किसी भी मदद की सराहना की जाती है।

उत्तर

0

ठीक है अगर कोई दिलचस्पी लेता है, तो मैंने एमओक को संस्करण 4 में अपडेट किया और अब सब कुछ अपेक्षित काम करता है।

0

इस स्थिति में एक शून्य संदर्भ आमतौर पर आपका सेटअप कभी नहीं मिला था। इसका अर्थ यह है कि इसे कभी भी सटीक मानों के साथ बुलाया नहीं गया था जिसे आपने इसे सेट किया था। इसे डीबग करने के लिए मैं यह सुनिश्चित करने के लिए कि आपका परीक्षण मॉक किए गए फ़ंक्शन पर किसी भी कॉल पर मेल खाएगा, यह सुनिश्चित करने के लिए आपका मैच कम बाधा डाल देगा। ज्यादातर मामलों में यह काफी अच्छा है। किसी भी कारण से आप विशिष्ट मूल्यों पर मिलान करने का प्रयास क्यों कर रहे हैं?

10

यदि आपको कॉल किया जा रहा है तो आपको GetEnumerator() के लिए एक सेटअप बनाना होगा। की तरह कुछ:

var mockPieces = new List<PieceType>; 
clonedGameBoardMock.Setup(g => g.GetEnumerator()).Returns(mockPieces.GetEnumerator()); 

नोट करें कि अगर इस मामले में मुद्दा है, लेकिन अगर तुम कभी IEnumerable<T> नकली करने की जरूरत है ध्यान देने योग्य।

3

The answer by @DanBryant हमारे समाधान की कुंजी भी थी। हालांकि, उस मामले में गणनाकर्ता को गलती से पुन: उपयोग किया जा सकता है। इसके बजाय, मैं उपयोग करने का सुझाव:

clonedGameBoardMock.Setup(g => g.GetEnumerator()).Returns(() => mockPieces.GetEnumerator()); 

यहाँ एक पूर्ण रेप्रो है (नया वर्ग NUnit 2.6.4 और Moq 4.2 का प्रयोग पुस्तकालय):

public interface IMyThing<T> : IEnumerable<T> 
{ 
    string Name { get; set; } 

    IMyThing<T> GetSub<U>(U key); 
} 

public interface IGenericThing 
{ 
    string Value { get; set; } 
} 

public class Pet 
{ 
    public string AnimalName { get; set; } 
} 

public class Unit 
{ 
    public IEnumerable<Pet> ConvertInput(IMyThing<IGenericThing> input) 
    { 
     return input.GetSub("api-key-123").Select(x => new Pet { AnimalName = x.Value }); 
    } 
} 

[TestFixture] 
public class Class1 
{ 
    [Test] 
    public void Test1() 
    { 
     var unit = new Unit(); 
     Mock<IMyThing<IGenericThing>> mock = new Mock<IMyThing<IGenericThing>>(); 
     Mock<IMyThing<IGenericThing>> submock = new Mock<IMyThing<IGenericThing>>(); 

     var things = new List<IGenericThing>(new[] { new Mock<IGenericThing>().Object }); 

     submock.Setup(g => g.GetEnumerator()).Returns(() => things.GetEnumerator()); 
     mock.Setup(x => x.GetSub(It.IsAny<string>())).Returns(submock.Object); 

     var result = unit.ConvertInput(mock.Object); 
     Assert.That(result, Is.Not.Null.And.Not.Empty); 
     Assert.That(result, Is.Not.Null.And.Not.Empty); // This would crash if the enumerator wasn't returned through a Func<>... 
    } 
} 

क्या इसके लायक है के लिए/इस सवाल का पॉप अप बनाने के लिए वह एक ही समस्या वाला एक अकेला गूगलर था: उपरोक्त कोचबेस .NET क्लाइंट का IView<T> इंटरफ़ेस का एक सारणित संस्करण है, जो IEnumerable<T> लागू करता है।

संबंधित मुद्दे