Pergunta

Eu estou experimentando algum comportamento estranho em Moq - apesar do fato de que eu configurar um objeto de simulação para agir de determinada maneira, e, em seguida, chamar o método no exatamente da mesma maneira no objeto que estou testando, ele reage como se o método nunca foi chamado.

Eu tenho a seguinte ação do controlador que eu estou tentando teste:

public ActionResult Search(string query, bool includeAll)
{
    if (query != null)
    {
        var keywords = query.Split(' ');
        return View(repo.SearchForContacts(keywords, includeAll));
    }
    else
    {
        return View();
    }
}

O meu código de teste de unidade:

public void SearchTestMethod() // Arrange
    var teststring = "Anders Beata";
    var keywords = teststring.Split(' ');
    var includeAll = false;
    var expectedModel = dummyContacts.Where(c => c.Id == 1 || c.Id == 2);
    repository
        .Expect(r => r.SearchForContacts(keywords, includeAll))
        .Returns(expectedModel)
        .Verifiable();

    // Act
    var result = controller.Search(teststring, includeAll) as ViewResult;

    // Assert
    repository.Verify();
    Assert.IsNotNull(result);
    AssertThat.CollectionsAreEqual<Contact>(
        expectedModel, 
        result.ViewData.Model as IEnumerable<Contact>
    );
}

onde AssertThat é apenas uma classe do meu próprio com um grupo de ajudantes de declaração (uma vez que a classe Assert não pode ser estendido com os métodos de extensão ... suspiro ...).

Quando eu executar o teste, ele falha na linha repository.Verify(), com um MoqVerificationException:

Test method MemberDatabase.Tests.Controllers.ContactsControllerTest.SearchTestMethod()
threw exception:  Moq.MockVerificationException: The following expectations were not met:
IRepository r => r.SearchForContacts(value(System.String[]), False)

Se eu remover repository.Verify(), o assert coleção falhar me dizendo que o modelo retornado é null. Eu tenho depurado e verificado que query != null, e que sou levada a parte do bloco if onde o código é executado. Não há problemas.

Por que isso não funciona?

Foi útil?

Solução

Eu suspeito que é porque a matriz que você está passando em seu repositório zombado (o resultado de teststring.Split(' ')) não é o mesmo objeto como o que realmente se passou a partir do método de pesquisa (o resultado de query.Split(' ')).

Tente substituir a primeira linha do seu código de configuração com:

repository.Expect(r => r.SearchForContacts(
    It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll))

... que irá comparar cada elemento da matriz passada para o seu simulada com o elemento correspondente na matriz keywords.

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