2013-02-27 16 views
8

Mam problem z weryfikacją, że próbę o IInterface.SomeMethod<T>(T arg) został wywołany przy użyciu Moq.Mock.Verify.Sprawdzanie metody ogólnej wywołanej za pomocą Moq

jestem w stanie zweryfikować tej metody został powołany na interfejsie „Standard” albo za pomocą It.IsAny<IGenericInterface>() lub It.IsAny<ConcreteImplementationOfIGenericInterface>(), i nie mam żadnych problemów z weryfikacją rodzajowe wywołanie metody z wykorzystaniem It.IsAny<ConcreteImplementationOfIGenericInterface>(), ale nie mogę zweryfikować metoda rodzajowa nazwano stosując It.IsAny<IGenericInterface>() - zawsze mówi, że metoda nie została wywołana, a test jednostkowy nie powiedzie się.

Oto moja próba jednostka:

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

Oto moja klasa badanego:

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

Oto mój IServiceInterface:

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

I tu jest mój interfejsu/klasy hierarchia dziedziczenia:

public interface ISpecificCommand 
{ 
} 

public class ConcreteSpecificCommand : ISpecificCommand 
{ 
} 

Odpowiedz

6

Jest to znany problem w Min 4.0.10827 która jest obecna wersja release. Zobacz tę dyskusję na GitHub https://github.com/Moq/moq4/pull/25. Pobrałem jego gałąź dev, skompilowałem ją i odniosłem do niej, a teraz twoje testy mijają.

+0

Zostało to poprawione. – arni

0

Zamierzam to rozbić. Od GenericMethod<T> wymaga argument T być zapewnione, że byłoby to możliwe do zrobienia:

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

Dzięki za wejście, ale to też nie działa. – sennett

Powiązane problemy