2010-11-28 5 views
1

Je jouais avec des tests en utilisant les spécifications de la machine et il y a quelque chose que je ne suis pas en mesure de le faire, je me demandais si quelqu'un a été là avant,LambdaExpression comparaison

Est-il possible d'utiliser Rhino Mocks pour créer un talon pour une méthode qui utilise une expression lambda, je trouve que je peux faire ce qui suit

Avoir cette méthode dans une classe d'échantillon:

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

je peux bouchonner la méthode comme ceci:

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

La chose est que je voudrais bouchonner la méthode pas Toute expression Lambda, juste pour la expression lambda spécifique"x=>x.Id==userId && user.IsActive ==true", de sorte que le test échouerait si ce changement d'expression dans la méthode ...

Je suppose que je pourrais créer un dépôt maquette qui ne va pas à la base de données et de tester le comportement dans le lambda mais cela, je me demandais s'il y a une autre approche de cette ...

toute suggestion sur cela, Merci

+0

Juste par curiosité, que signifie "bdd" lorsque vous l'utilisez comme balise dans votre question? Je suppose que vous ne voulez pas dire des diagrammes de décision binaires ... –

+0

@Pascal Cuoq: Développement axé sur le comportement: http://en.wikipedia.org/wiki/Behavior_Driven_Development. – jason

Répondre

2

Vous ne voulez pas tester que l'expression lambda particulière est utilisée dans la méthode. Vous voulez tester le comportement que la méthode est censée avoir. Tester des détails d'implémentation comme une expression lambda spécifique est en général trop fragile. Au lieu de cela:

[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

Merci, j'ai compris –