在rspec测试中,我想为两个不同的类实现共享测试以避免重复。测试在对象foo
和bar
上执行。我的测试具有以下结构:
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
声明期间bar
和FOOBAR
不可用,因此无效。它们仅在it
块期间有效。我该如何实现这样的测试模式?
答案 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 }
或者,如果你想把它保持为常数(我不认为你应该这样做,因为它取决于foo
和bar
的值而且它们不是常数)
before do
FOOBAR = { 'foo' => foo, 'bar' => bar }
end