MOQ: Especificar valores de retorno como parte das expectativas
-
08-07-2019 - |
Pergunta
Eu sou novo para Moq e aprendizagem.
Eu preciso de teste que um método retorna o valor esperado. Tenho juntos um exemplo noddy para explicar o meu problema. Esta falha miseravelmente com:
"ArgumentException: expressão não é uma chamada de método: c => (c.DoSomething (" Jo " "Blog", 1) = "OK")"
Você pode corrigir o que estou fazendo de errado?
[TestFixtureAttribute, CategoryAttribute("Customer")]
public class Can_test_a_customer
{
[TestAttribute]
public void Can_do_something()
{
var customerMock = new Mock<ICustomer>();
customerMock.Setup(c => c.DoSomething("Jo", "Blog", 1)).Returns("OK");
customerMock.Verify(c => c.DoSomething("Jo", "Blog", 1)=="OK");
}
}
public interface ICustomer
{
string DoSomething(string name, string surname, int age);
}
public class Customer : ICustomer
{
public string DoSomething(string name, string surname, int age)
{
return "OK";
}
}
Em poucas palavras:? Se eu queria testar um método como o descrito acima, e eu sei que eu estou esperando de volta um "OK", como eu ia escrevê-lo usando Moq
Obrigado por todas as sugestões.
Solução
- Você precisa de um assunto de teste que interage com objetos mock (a menos que você está escrevendo um teste aluno para Moq.) Eu escrevi um simples abaixo
- expectativas instalação você no objeto fictício, especificando os argumentos exatos (estrita - se você quiser é claro,
Is.Any<string>
uso mais para aceitar qualquer string) e especificar valores de retorno se houver - O seu assunto de teste (como parte da etapa de Lei do teste) vai chamar para o seu simulada
- Você afirma o assunto de teste se comportaram conforme necessário. O valor de retorno dos métodos de simulação será utilizado pelo sujeito de teste -. Verificar isso através da interface pública do assunto de teste
- Você também verificar se todas as expectativas que você especificou foram atendidas -. Todos os métodos que você espera para ser chamado eram de fato chamado
.
[TestFixture]
public class Can_test_a_customer
{
[Test]
public void Can_do_something()
{
//arrange
var customerMock = new Moq.Mock<ICustomer>();
customerMock.Setup(c => c.DoSomething( Moq.It.Is<string>(name => name == "Jo"),
Moq.It.Is<string>(surname => surname == "Blog"),
Moq.It.Is<int>(age => age == 1)))
.Returns("OK");
//act
var result = TestSubject.QueryCustomer(customerMock.Object);
//assert
Assert.AreEqual("OK", result, "Should have got an 'OK' from the customer");
customerMock.VerifyAll();
}
}
class TestSubject
{
public static string QueryCustomer(ICustomer customer)
{
return customer.DoSomething("Jo", "Blog", 1);
}
}
Outras dicas
Mock<T>.Verify
não devolver o valor que a chamada de método retornou, então você não pode simplesmente compará-lo com o valor esperado usando "==".
Na verdade, há sem sobrecarga de Verifique que retorna nada , porque você nunca deve precisar verificar se um método zombou retorna um valor específico. Afinal, você foram responsáveis ??por configurá-lo para retornar esse valor em primeiro lugar! valores de retorno de métodos zombaram estão lá para ser usado pelo código que você está testando -. você não está testando as simulações
Use Verifique para confirmar que o método foi chamado com os argumentos esperados, ou que uma propriedade foi atribuído um valor que você esperava. Os valores de retorno de métodos e propriedades zombaram não são importantes no momento em que você começa a fase de "assert" do seu teste.
Você está fazendo a mesma coisa esse cara estava fazendo aqui: Como verificar um outro método na classe foi chamado usando Moq
Você está zombando o que você está testando. Isso não faz sentido. Uso de Mocks é para isolamento. Seu teste Can_Do_Something vai sempre passar . Não importa o que. Este não é um bom teste.
Dê uma olhada no teste de Gishu ou o teste propus na questão SO ligados.