2010-11-28 12 views
1

Ich spiele herum mit Prüfmaschine Spezifikationen verwenden, und es ist etwas, das ich bin gerade zu tun nicht in der Lage, fragt mich, ob jemand dort gewesen,Lambda Vergleich

Gibt es eine Möglichkeit Rhino Mocks zu verwenden zu erstellen a Stummel für ein Verfahren, das einen Lambda-Ausdruck verwendet, fand ich, dass ich die folgende

mit dieser Methode in einer Probe Klasse tun können:

public void UpdateVisit(int userId){ 
    var user = repository.FindBy<User>(x=>x.Id==userId && user.IsActive ==true); 
    user.Visit = user.Visit + 1; 
    repository.Save(user); 
} 

ich die Methode wie folgt Stummel kann:

//...Inside test method 
var user = new User(); 
repository.Stub(x=>x.FindBy<User>(Arg<Expression<Func<User,bool>>>.Is.Anything)).Return(user); 

Die Sache ist, ich möchte die Methode Stummel nicht Beliebig Lambda Expression, nur für die spezifischen Lambda-Ausdruck"x=>x.Id==userId && user.IsActive ==true", so dass der Test fehlschlagen würde, wenn dieser Ausdruck Änderungen in der Methode zur ...

ich glaube, ich könnte eine Mock-Repository erstellen, die nicht in die Datenbank geht und das Verhalten in dem Lambda obwohl dies testen, ich frage mich, ob es eine anderer Ansatz dazu ist ...

Vorschläge schätze auf dies, Danke

+0

Nur aus Neugier, wofür steht "bdd", wenn Sie es als Tag in Ihrer Frage verwenden? Ich schätze, Sie meinen nicht binäre Entscheidungsdiagramme ... –

+0

@Pascal Cuoq: Verhaltensorientierte Entwicklung: http://en.wikipedia.org/wiki/Behavior_Driven_Development. – jason

Antwort

2

Sie möchten nicht testen, dass der bestimmte Lambda-Ausdruck in der Methode verwendet wird. Sie möchten das Verhalten testen, das die Methode haben soll. Das Testen von Implementierungsdetails wie einem bestimmten Lambda-Ausdruck ist im Allgemeinen zu spröde. Stattdessen:

[Fact] 
UpdateVisit_updates_Visit_for_user_that_is_in_the_repository_and_is_active() { 
    // set up mock repository with dummy user having 
    // userId == 1, 
    // IsActive == true, 
    // Visit = 42 
    // invoke UpdateVisit 
    // pull userId == 1 from the repository 
    Assert.Equal(43, user.Visit); 
} 

[Fact] 
UpdateVisit_does_not_update_visit_for_user_that_is_not_active() { 
    // etc. 
} 
+0

Danke, habe den Punkt –