unit testing - verifiable - Moq espera en IRepository que pasa la expresión
verify moq (5)
En Rhino Mocks harías algo como esto ...
En lugar de usar un Expect, use un Stub e Ignore los argumentos. Entonces has -
Func<JSOFile, bool> _myDelegate;
_repository.Stub(f => FindAll(null)).IgnoreArguments()
.Do( (Func<Func<JSOFile, bool>, IEnumerable<JSOFile>>) (del => { _myDelegate = del; return new List<JSOFile>();});
Llamar a Real Code
* Configura un objeto falso JSOFile con STATUS_CD establecido en "A" *
Assert.IsTrue(_myDelegate.Invoke(fakeJSO));
Estoy usando este código para verificar el comportamiento de un método que estoy probando:
_repository.Expect(f => f.FindAll(t => t.STATUS_CD == "A"))
.Returns(new List<JSOFile>())
.AtMostOnce()
.Verifiable();
_repository se define como:
private Mock<IRepository<JSOFile>> _repository;
Cuando se ejecuta mi prueba, obtengo esta excepción:
La expresión t => (t.STATUS_CD = "A") no es compatible.
¿Puede alguien decirme cómo puedo probar este comportamiento si no puedo pasar una expresión al método Expect?
¡¡Gracias!!
Prueba esto
_repository.Expect(f => f.FindAll(It.Is<SomeType>(t => t.STATUS_CD == "A")))
Una manera fácil de verificar si hay errores es asegurarse de que al final de una llamada esperada siempre tenga tres '')''.
Si desea probar que se pasa el parámetro correcto, siempre puede "abusar" de la declaración de devoluciones:
bool correctParamters = true;
_repository.Expect (f => f.FindAll (It.IsAny> ()))
.Returns ((Func func) => {correctParamters = func (fakeJSOFile); return new List-JSOFile- ();})
.Como máximo una vez()
.Verifiable();
Assert.IsTrue (correctParamters);
Esto invocará la función pasada con los argumentos que desee.
Al navegar por la lista de discusión de Moq, creo que encontré la respuesta:
Parece que he encontrado una limitación del marco Moq.
Editar, he encontrado otra forma de probar la expresión:
http://blog.stevehorn.cc/2008/11/testing-expressions-with-moq.html
Esto es un poco engañoso. Hago un .ToString () en las expresiones y las comparo. Esto significa que debe escribir la lambda de la misma manera en la clase bajo prueba. Si quisieras, podrías hacer un análisis sintáctico en este punto
[Test]
public void MoqTests()
{
var mockedRepo = new Mock<IRepository<Meeting>>();
mockedRepo.Setup(r => r.FindWhere(MatchLambda<Meeting>(m => m.ID == 500))).Returns(new List<Meeting>());
Assert.IsNull(mockedRepo.Object.FindWhere(m => m.ID == 400));
Assert.AreEqual(0, mockedRepo.Object.FindWhere(m => m.ID == 500).Count);
}
//I broke this out into a helper as its a bit ugly
Expression<Func<Meeting, bool>> MatchLambda<T>(Expression<Func<Meeting, bool>> exp)
{
return It.Is<Expression<Func<Meeting, bool>>>(e => e.ToString() == exp.ToString());
}