RSpec:以DRY方法测试一组值

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方法?

谢谢!

Pan*_*kos 5

是的,您可以执行以下元编程来运行一系列都遵循相同格式的测试:

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)