迭代rspec测试用例中的对象

时间:2016-06-30 19:27:47

标签: ruby rspec

在rspec测试中,我想为两个不同的类实现共享测试以避免重复。测试在对象foobar上执行。我的测试具有以下结构:

let(:foo) { create(:foo) }
let(:bar) { create(:bar) }

FOOBAR = {
  "foo" => foo,
  "bar" => bar
}

describe 'POST :id/foobar_type/:foobar_id/do' do
  FOOBAR.each do |foobar_type, foobar|
    it 'creates something on an foobar' do
    end

    it 'raises an error if unauthorized' do
    end

    ...
  end
end

由于在foo声明期间barFOOBAR不可用,因此无效。它们仅在it块期间有效。我该如何实现这样的测试模式?

2 个答案:

答案 0 :(得分:1)

你应该看看shared_examples

对于你给出的略微抽象的例子:

RSpec.shared_examples 'good foobar' do |foobar|
   it 'creates something on a foobar' do
   end

   it 'raises an error if unauthorized' do
   end
   ... 
end

然后,您可以像这样调用共享示例。

describe 'POST :id/foobar_type/:foobar_id/do' do
  it behaves_like 'a good foobar' foo
  it behaves_like 'a good foobar' bar
end

答案 1 :(得分:0)

如果您能够使FOOBAR成为非常数,那么您可以将其定义为

let(:foobar) { 'foo' => foo, 'bar' => bar }

或者,如果你想把它保持为常数(我不认为你应该这样做,因为它取决于foobar的值而且它们不是常数)

before do
  FOOBAR = { 'foo' => foo, 'bar' => bar }
end