La expectativa sobre el objeto simulado no parece cumplirse (Moq)
-
10-07-2019 - |
Pregunta
Estoy experimentando un comportamiento extraño en Moq: a pesar del hecho de que configuré un objeto simulado para actuar de cierta manera y luego llamé al método exactamente de la misma manera en el objeto que estoy probando, reacciona como si el método nunca fue llamado.
Tengo la siguiente acción de controlador que estoy intentando probar:
public ActionResult Search(string query, bool includeAll)
{
if (query != null)
{
var keywords = query.Split(' ');
return View(repo.SearchForContacts(keywords, includeAll));
}
else
{
return View();
}
}
Código de prueba de mi unidad:
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>
);
}
donde AssertThat
es solo una clase propia con un montón de ayudantes de aserción (ya que la clase Assert
no se puede extender con métodos de extensión ... suspiro. ..).
Cuando ejecuto la prueba, falla en el repositorio .Verify ()
, con una 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)
Si elimino el repositorio .Verify ()
, la afirmación de la colección falla diciéndome que el modelo devuelto es nulo
. He depurado y comprobado esa query! = Null
, y que estoy en la parte del bloque if
donde se ejecuta el código. No hay problemas allí.
¿Por qué no funciona esto?
Solución
Sospecho que es porque la matriz que está pasando a su repositorio simulado (el resultado de teststring.Split ('')
) no es el mismo objeto que el que realmente se pasa El método de búsqueda (el resultado de query.Split ('')
).
Intente reemplazar la primera línea de su código de configuración con:
repository.Expect(r => r.SearchForContacts(
It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll))
... que comparará cada elemento de la matriz que se pasó a su simulacro con el elemento correspondiente en la matriz keywords
.