VoteUp(int id) と VoteDown(int id) という 2 つの非常によく似たコントローラー アクションに対して、2 つの非常によく似た仕様があります。これらのメソッドにより、ユーザーは投稿に賛成票または反対票を投じることができます。StackOverflow の質問に対する賛成/反対の投票機能のようなものです。仕様は次のとおりです。
反対票を投じる:
[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;
}
投票:
[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;
}
だから私は2つの質問があります:
これら 2 つの仕様を DRY するにはどうすればよいですか? コントローラーアクションごとに1つの仕様を実際に持つべきですか? 私は通常そうすべきだと知っていますが、これは自分自身を何度も繰り返しているように感じます.
It
同じ仕様内で2番目を実装する方法はありますか? には、 2 回It should_not_let_the_user_vote_more_than_once;
呼び出す仕様が必要であることに注意してください。個別の仕様を作成するのが最も簡単なのはわかっていますが、同じコードをもう一度controller.VoteDown(1)
コピーして貼り付ける必要があります...
私はまだ BDD (および MSpec) のコツをつかんでいますが、多くの場合、どちらに進むべきか、または BDD のベスト プラクティスやガイドラインが何であるかが明確ではありません。どんな助けでも大歓迎です。