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.

Foi útil?

Solução

  1. 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
  2. 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
  3. O seu assunto de teste (como parte da etapa de Lei do teste) vai chamar para o seu simulada
  4. 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
  5. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top