对于两个非常类似的控制器操作,我有两个非常相似的规格:VoteUp(int id)和VoteDown(int id)。这些方法允许用户向上或向下投票;有点像StackOverflow问题的投票上/下功能。该规范是:使用MSpec(BDD准则)干燥非常类似的ASP.NET MVC控制器操作规范
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;
}
所以我有两个问题:
我应该如何去DRY-ING这两种规格?这是甚至可取的,或者我应该每个控制器操作实际上有一个规格?我知道我通常应该,但是这感觉好像重复了很多。
有没有什么办法可以在同一规范内实现第二个
It
?请注意,It should_not_let_the_user_vote_more_than_once;
要求我规范拨打controller.VoteDown(1)
两次。我知道最简单的是为它创建一个单独的规范太多,但它会被复制并再次粘贴相同的代码...
我仍然得到BDD的窍门(和MSpec),很多时候我不清楚应该去哪个方向,或者BDD的最佳实践或指导方针。任何帮助,将不胜感激。
再次感谢。我知道行为(实际上来自MSpec源代码示例),但感觉就像我不得不把它放到我的场景中;它并不觉得自然合适。非常好的答案,谢谢。 – 2010-05-16 10:52:34