2012-11-16 10 views
5

Ich versuche, eine generische Testklasse zu erstellen, um meine generischen Controller zu testen. Alles funktioniert gut, außer dies: Ich habe eine Methode wie folgt aus:Ausdruck <Func <T, bool>> mit It.IsAny immer True zurückgegeben

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

Ich versuche zu installieren Sie den Test wie folgt:

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()); 

und führen Sie den Test wie folgt aus:

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

Diese immer eine neue T. zurückkehren

Ist mein Setup falsch?

+0

aufrufen Was ist es, dass Sie testen? Es scheint mir, dass Sie sich darüber lustig machen wollen, die Repository-Lookup-Logik tatsächlich zu implementieren. – fsimonazzi

Antwort

8

Sie weisen Moq an, dieselbe exakte Instanz (in diesem Fall new T()) zurückzugeben, die unabhängig vom angegebenen Ausdruck jederzeit GetSingle aufgerufen wird. Was Sie eigentlich wollen ist, dass er diesen Ausdruck gegen items:

+0

Danke gehackt! Ich arbeite seit einer Weile daran und konnte es nicht richtig funktionieren. Ich bin ziemlich neu, danke, dass du mir geholfen hast, mich zu verbessern! –

+1

'Single()' tut, was gemeint ist, und es hat [eine Überladung] (http://msdn.microsoft.com/en-us/library/bb534800.aspx), die genau dieses Argument nimmt. Und es ist wahrscheinlich besser, denn es wird geworfen, wenn es mehr als einen passenden Gegenstand gibt. – svick

+0

Ja, mein Fehler bei der Überlastung des Prädikats. – HackedByChinese

Verwandte Themen