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?

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top