Soy bastante nuevo en las pruebas unitarias en C # y estoy aprendiendo a usar Moq. A continuación se muestra la clase que estoy tratando de probar.
class MyClass
{
SomeClass someClass;
public MyClass(SomeClass someClass)
{
this.someClass = someClass;
}
public void MyMethod(string method)
{
method = "test"
someClass.DoSomething(method);
}
}
class Someclass
{
public DoSomething(string method)
{
// do something...
}
}
A continuación se muestra mi TestClass:
class MyClassTest
{
[TestMethod()]
public void MyMethodTest()
{
string action="test";
Mock<SomeClass> mockSomeClass = new Mock<SomeClass>();
mockSomeClass.SetUp(a => a.DoSomething(action));
MyClass myClass = new MyClass(mockSomeClass.Object);
myClass.MyMethod(action);
mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>()));
}
}
Me sale la siguiente excepción:
Expected invocation on the mock at least once, but was never performed
No setups configured.
No invocations performed..
Solo quiero verificar si se llama o no al método "MyMethod". ¿Me estoy perdiendo de algo?
SomeClass
no tiene una definición paraMyMethod(string)
, lo que parece que no tiene.Respuestas:
Estás comprobando el método incorrecto. Moq requiere que configure (y luego opcionalmente verifique) el método en la clase de dependencia.
Deberías estar haciendo algo más como esto:
En otras palabras, está verificando esa llamada
MyClass#MyMethod
, su clase definitivamente llamaráSomeClass#DoSomething
una vez en ese proceso. Tenga en cuenta que no necesita elTimes
argumento; Solo estaba demostrando su valor.fuente
mockSomeClass.VerifyAll();
lograría el mismo resultado y estaría más SECO?Mock
comparación conNSubstitute
es que si está tratando de verificar también los parámetros y la verificación falla, solo muestra qué invocaciones se realizaron, pero no muestra qué se esperaba exactamente si usó variables en la expresión de verificación: solo mostrará la variable nombre, no su valor, por lo que deberá depurar para verificar qué valor tiene exactamente esa variable. NSubstitute solo mostrará valores de ambos e incluso donde era diferente.