J'ai deux spécifications très similaires pour deux actions de contrôleur très similaires: VoteUp (int id) et VoteDown (int id). Ces méthodes permettent à un utilisateur de voter un post en haut ou en bas; un peu comme la fonctionnalité de vote haut/bas pour les questions StackOverflow. Les spécifications sont les suivantes:DRY-ing spécifications très similaires pour l'action du contrôleur ASP.NET MVC avec MSpec (directives BDD)
VoteDown:
[Subject(typeof(SomeController))]
public class When_user_clicks_the_vote_down_button_on_a_post : SomeControllerContext
{
Establish context =() =>
{
post = PostFakes.VanillaPost();
post.Votes = 10;
session.Setup(s => s.Single(Moq.It.IsAny<Expression<Func<Post, bool>>>())).Returns(post);
session.Setup(s => s.CommitChanges());
};
Because of =() => result = controller.VoteDown(1);
It should_decrement_the_votes_of_the_post_by_1 =() => suggestion.Votes.ShouldEqual(9);
It should_not_let_the_user_vote_more_than_once;
}
VoteUp:
[Subject(typeof(SomeController))]
public class When_user_clicks_the_vote_down_button_on_a_post : SomeControllerContext
{
Establish context =() =>
{
post = PostFakes.VanillaPost();
post.Votes = 0;
session.Setup(s => s.Single(Moq.It.IsAny<Expression<Func<Post, bool>>>())).Returns(post);
session.Setup(s => s.CommitChanges());
};
Because of =() => result = controller.VoteUp(1);
It should_increment_the_votes_of_the_post_by_1 =() => suggestion.Votes.ShouldEqual(1);
It should_not_let_the_user_vote_more_than_once;
}
J'ai donc deux questions:
Comment dois-je aller sur DRY-ment ces deux spécifications ? Est-il même conseillé ou devrais-je avoir une spécification par action de contrôleur? Je sais que je le devrais normalement, mais j'ai l'impression de me répéter beaucoup.
Existe-t-il un moyen d'implémenter le second
It
dans la même spécification? Notez que leIt should_not_let_the_user_vote_more_than_once;
nécessite la spécification pour appeler deux fois lecontroller.VoteDown(1)
. Je sais que le plus simple serait de créer une spécification séparée pour elle aussi, mais ce serait de copier-coller le même code encore une fois ...
Je reçois toujours le coup de BDD (et MSpec) et de nombreuses fois, je ne vois pas dans quelle direction je devrais aller, ni quelles sont les meilleures pratiques ou lignes directrices pour BDD. Toute aide serait appréciée.
Merci encore. Je connaissais les comportements (à partir de l'exemple de code source de MSpec), mais j'avais l'impression que je devais l'intégrer à mon scénario; ça ne me semblait pas naturel. Réponse brillante, merci un million. –