Espressione > con It.IsAny restituisce sempre true

c# expression-trees generics moq unit-testing

Domanda

Sto cercando di creare un test generico per testare i miei controller generici. Tutto funziona bene tranne questo: ho un metodo come questo:

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 esegui il test in questo modo:

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

Questo restituisce sempre un nuovo T.

Il mio setup è sbagliato?

Risposta accettata

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

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché