Expectativa sobre Mock objeto não parece ser atendidas (MOQ)
-
10-07-2019 - |
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?
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
.