2012-11-16 9 views
5

Sto provando a creare un test generico per testare i miei controller generici. Tutto sta funzionando benissimo tranne questo: Ho un metodo come questo:Espressione <Func <T, bool>> con It.IsAny restituisce sempre true

private T GetSingle(Expression<Func<T, bool>> expression) 

sto cercando di impostare il test in questo modo:

var Guids = new[] { Guid.NewGuid(), Guid.NewGuid() }; 
var items = Guids.Select(x => new T {Id = x}); 
var mock = new Mock<IRepository<T>>(); 
mock.Setup(m => m.GetSingle(
    It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns(new T()); 

ed eseguire il test come questo:

var value = Repository.GetSingle(x=> x.Id == Guid.NewGuid()); 

Questo sempre restituire una nuova T.

La mia installazione è sbagliata?

+0

Che cosa stai testando? Mi sembra che tu voglia prendere in giro l'implementazione della logica di ricerca del repository. – fsimonazzi

risposta

8

Si sta istruendo Moq per restituire la stessa istanza esatta (in questo caso, new T()), ogni volta che viene richiamato GetSingle, indipendentemente dall'espressione fornita. Quello che vuoi veramente è invocare quell'espressione contro items:

mock.Setup(m => m.GetSingle(It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns<Expression<Func<T, bool>>>(expression => items.AsQueryable().Single(expression)); 
+0

Grazie Hacked! Ci sto lavorando da un po 'e non riesco a farlo funzionare correttamente. Sono abbastanza nuovo a questo, grazie per avermi aiutato a migliorare! –

+1

'Single()' fa ciò che si intende e ha [un sovraccarico] (http://msdn.microsoft.com/en-us/library/bb534800.aspx) che accetta esattamente quell'argomento. Ed è probabilmente meglio, perché genererà se c'è più di un oggetto corrispondente. – svick

+0

Sì, il mio errore sul sovraccarico del predicato. – HackedByChinese