And*_*rew 5 refactoring rspec ruby-on-rails dry ruby-on-rails-3
我有一个vote模型,它有一个称为的类方法score。基本上,我在电子表格中创建了一个数学方程式,并尝试在ruby中重现该方程式。但是,我的第一步不起作用,所以我真的需要开始添加更多的测试。
我想要进行测试的方法是从电子表格中获取一堆输入和输出值,然后分别对它们进行测试。因此,基本上,测试可以解释为如下所示:
inputs = [a,b,c] ... score.should == x
inputs = [a,b,c,d] ... score.should == y
inputs = [c,d] .... score.should == z
Run Code Online (Sandbox Code Playgroud)
但是,我实际上发现在RSpec中编写此代码的最短方法是为每种情况提供一个示例,大致类似于此示例(简化示例,但应能为您提供想法):
it "should have a score of X" do
test_object = Votable.new(...)
@user1.vote.create(:value=>##, :votable=>test_object)
@user2.vote.create(:value=>##, :votable=>test_object)
@user3.vote.create(:value=>##, :votable=>test_object)
test_object.votes.score.should == X
end
Run Code Online (Sandbox Code Playgroud)
因此,上面的方法可以工作,但是每个示例案例都有大量的文本,并且为了解决问题,并提供良好的测试覆盖范围,我想运行大约20个左右的测试案例。
因此,认真地讲,必须有一种更简单的方法来进行一次设置,然后测试一堆可能的输入/输出组合,对吗?谁能建议在RSpec中进行这种测试的DRY方法?
谢谢!
是的,您可以执行以下元编程来运行一系列都遵循相同格式的测试:
results = { x: ['a', 'b', 'c'], y: ['a','b','c','d'] }
results.each do |score, values|
it "should have a score of #{score}" do
test_object = Votable.new(...)
values.each do |value|
User.create(...).vote.create(value: value, votable: test_object)
end
test_object.votes.score.should == score
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2199 次 |
| 最近记录: |