Eu sou bastante novo no teste de unidade em C # e aprendendo a usar o Moq. Abaixo está a turma que estou tentando testar.
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...
}
}
Abaixo está o meu 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>()));
}
}
Eu recebo a seguinte exceção:
Expected invocation on the mock at least once, but was never performed
No setups configured.
No invocations performed..
Eu só quero verificar se o método "MyMethod" está sendo chamado ou não. Estou esquecendo de algo?
SomeClass
não houver uma definiçãoMyMethod(string)
, o que parece não ter.Respostas:
Você está verificando o método errado. O Moq exige que você configure (e, opcionalmente, verifique) o método na classe de dependência.
Você deveria estar fazendo algo mais parecido com isto:
Em outras palavras, você está verificando essa chamada
MyClass#MyMethod
, sua classe definitivamente ligará umaSomeClass#DoSomething
vez nesse processo. Observe que você não precisa doTimes
argumento; Eu estava apenas demonstrando seu valor.fonte
mockSomeClass.VerifyAll();
alcançaria o mesmo resultado e seria mais SECO?Mock
comparaçãoNSubstitute
é que, se você está tentando verificar também os parâmetros e a verificação falha, isso mostra apenas quais invocações foram executadas, mas não mostra o que exatamente era esperado se você usasse variáveis na expressão de verificação - apenas mostraria a variável nome, não seu valor; portanto, você precisará depurar para verificar qual valor exatamente essa variável possui. O NSubstitute mostrará apenas os valores de ambos e mesmo de onde foram diferentes.