2013-02-27 6 views
8

का उपयोग करके जेनेरिक विधि की पुष्टि करना मुझे IInterface.SomeMethod<T>(T arg) का नकल सत्यापित करने में समस्या हो रही है जिसे Moq.Mock.Verify का उपयोग करके बुलाया गया था।मोक

मुझे लगता है कि विधि "स्टैंडर्ड" इंटरफेस या तो It.IsAny<IGenericInterface>() या It.IsAny<ConcreteImplementationOfIGenericInterface>() के प्रयोग पर बुलाया गया था सत्यापित कर सकते हैं कर रहा हूँ, और मैं It.IsAny<ConcreteImplementationOfIGenericInterface>() का उपयोग कर एक सामान्य विधि कॉल की पुष्टि करने के लिए कोई मुसीबतों है, लेकिन मैं पुष्टि नहीं कर सकते एक सामान्य विधि का उपयोग कर बुलाया गया था It.IsAny<IGenericInterface>() - यह हमेशा कहता है कि विधि को नहीं बुलाया गया था और इकाई परीक्षण विफल रहता है।

public void TestMethod1() 
{ 
    var mockInterface = new Mock<IServiceInterface>(); 

    var classUnderTest = new ClassUnderTest(mockInterface.Object); 

    classUnderTest.Run(); 

    // next three lines are fine and pass the unit tests 
    mockInterface.Verify(serviceInterface => serviceInterface.NotGenericMethod(It.IsAny<ConcreteSpecificCommand>()), Times.Once()); 
    mockInterface.Verify(serviceInterface => serviceInterface.NotGenericMethod(It.IsAny<ISpecificCommand>()), Times.Once()); 
    mockInterface.Verify(serviceInterface => serviceInterface.GenericMethod(It.IsAny<ConcreteSpecificCommand>()), Times.Once()); 

    // this line breaks: "Expected invocation on the mock once, but was 0 times" 
    mockInterface.Verify(serviceInterface => serviceInterface.GenericMethod(It.IsAny<ISpecificCommand>()), Times.Once()); 
} 

यहाँ परीक्षण के अंतर्गत मेरी कक्षा है:

यहाँ मेरी इकाई परीक्षण है

public interface IServiceInterface 
{ 
    void NotGenericMethod(ISpecificCommand command); 
    void GenericMethod<T>(T command); 
} 

और यहाँ मेरी इंटरफ़ेस/वर्ग है:

public class ClassUnderTest 
{ 
    private IServiceInterface _service; 

    public ClassUnderTest(IServiceInterface service) 
    { 
     _service = service; 
    } 

    public void Run() 
    { 
     var command = new ConcreteSpecificCommand(); 
     _service.GenericMethod(command); 
     _service.NotGenericMethod(command); 
    } 
} 

यहाँ मेरी IServiceInterface है विरासत पदानुक्रम:

public interface ISpecificCommand 
{ 
} 

public class ConcreteSpecificCommand : ISpecificCommand 
{ 
} 

उत्तर

6

यह Moq 4.0.10827 एक मौजूदा रिलीज संस्करण है, जिसमें एक ज्ञात समस्या है। गिटहब https://github.com/Moq/moq4/pull/25 पर इस चर्चा को देखें। मैंने अपनी देव शाखा डाउनलोड की है, इसे संकलित और संदर्भित किया है और अब आपका परीक्षण पास हो गया है।

+0

इसे तब से सही किया गया है। – arni

0

मैं इसे विंग करने जा रहा हूं। चूंकि GenericMethod<T> की आवश्यकता है कि एक टी तर्क प्रदान किया, यह करने के लिए संभव हो जाएगा:

mockInterface.Verify(serviceInterface => serviceInterface.GenericMethod(It.Is<object>(x=> typeof(ISpecificCommand).IsAssignableFrom(x.GetType()))), Times.Once()); 
+0

इनपुट के लिए धन्यवाद, लेकिन ऐसा लगता है कि यह भी काम नहीं करता है। – sennett

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