2008-11-13 18 views
9

Pasando Estoy usando este código para comprobar un comportamiento de un método que estoy probando:Moq esperar de IRepository Expresión

_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:

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!

Respuesta

0

En Rhino se burla de usted haría algo como esto ...

lugar de utilizar un esperar, utilizan un código auxiliar e ignorar los argumentos. Luego tienen -

Func<JSOFile, bool> _myDelegate; 

_repository.Stub(f => FindAll(null)).IgnoreArguments() 
    .Do((Func<Func<JSOFile, bool>, IEnumerable<JSOFile>>) (del => { _myDelegate = del; return new List<JSOFile>();}); 

Call Código Real

* Configuración de un objeto JSOFile falso con STATUS_CD ajustado en "A" *

Assert.IsTrue(_myDelegate.Invoke(fakeJSO)); 
0

intenta 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 ays tienen tres ')' s.

+0

el método se vuelve método de T. El FindAll toma una Func <...>, así que esto no va a funcionar. –

0

Si desea probar el parámetro correcto se pasa siempre se puede "abusar" de la instrucción devuelve:

correctParamters bool = true;

_repository.Expect (f => f.FindAll (It.IsAny>()))

.Returns ((Func func) => {correctParamters = FUNC (fakeJSOFile); volver nueva lista-JSOFile-();})

.AtMostOnce()

.Verifiable();

Assert.IsTrue (correctParamters);

Esto invocará la función transferida con los argumentos que desee.

2

Esto es un poco de una manera cheaty. 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 algo de análisis 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()); 
    }