2013-02-27 24 views
8

Ho difficoltà a verificare che la simulazione di IInterface.SomeMethod<T>(T arg) sia stata chiamata utilizzando Moq.Mock.Verify.Verifica del metodo generico chiamato utilizzando Moq

Sono in grado di verificare che il metodo è stato chiamato su un'interfaccia "Standard" sia utilizzando It.IsAny<IGenericInterface>() o It.IsAny<ConcreteImplementationOfIGenericInterface>(), e non ho problemi di verifica di una chiamata di metodo generico utilizzando It.IsAny<ConcreteImplementationOfIGenericInterface>(), ma non riesco a verificare un metodo generico è stato chiamato con It.IsAny<IGenericInterface>() - dice sempre che il metodo non è stato chiamato e il test dell'unità fallisce.

Ecco il mio test di unità:

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()); 
} 

Qui è la mia classe in prova:

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); 
    } 
} 

Ecco il mio IServiceInterface:

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

e qui è la mia interfaccia/classe gerarchia ereditaria:

public interface ISpecificCommand 
{ 
} 

public class ConcreteSpecificCommand : ISpecificCommand 
{ 
} 

risposta

6

È un problema noto nel Moq 4.0.10827 che è una versione corrente. Vedi questa discussione a GitHub https://github.com/Moq/moq4/pull/25. Ho scaricato il suo ramo dev, lo ho compilato e referenziato e ora passa il test.

+0

Da allora è stato corretto. – arni

0

Ho intenzione di volare. Poiché GenericMethod<T> richiede che sia disponibile un argomento T, sarebbe possibile fare:

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

Grazie per l'input, ma questo non sembra funzionare neanche. – sennett