rspec 一次构建多个测试,记忆变量有问题
rspec build many tests at once with each, problem with memoized variables
我需要构建一些非常重复的 rspec 测试,并想稍微干燥一下。
describe 'filter' do
let!(:filter_1) { create :filterable, value: 1 }
let!(:filter_2) { create :filterable, value: 2 }
let!(:filter_3) { create :filterable, value: 3 }
let!(:filter_4) { create :filterable, value: 4 }
expected = {
a: filter_1,
b: filter_2,
c: filter_3,
d: filter_4
}
expected.each do |filter, expected|
describe "by #{filter}" do
let(:expected) { [ expected ] }
it "shows only #{filter}" do
get :index, filter: filter
expect(assigns[:filters]).to match_array expected
end
end
end
end
我主要是用我的过滤器和预期结果定义一个散列,然后为每个过滤器构建一个测试。
问题是如何在散列中指定预期结果。
此示例引发错误:
rspec-core-3.4.4/lib/rspec/core/example_group.rb:667:in `method_missing': `filter_1`
is not available on an example group (e.g. a `describe` or `context` block).
It is only available from within individual examples (e.g. `it` blocks)
or from constructs that run in the scope of an example (e.g. `before`, `let`, etc).
(RSpec::Core::ExampleGroup::WrongScopeError)```
I think the memoized variables are only available within an `it` block.
how could I solve this?
thanks,
describe 'filter' do
expected_filters = -> () do
filter_1 = '1'
filter_2 = '2'
{ a: filter_1, b: filter_2 }
end
expected_filters.().each do |filter, expected|
describe "by #{filter}" do
it "shows only #{filter}" do
expect(filter).to be_instance_of(Symbol)
expect(expected).to be_instance_of(String)
end
end
end
end
但是如果您需要 Let!
中的代码是 运行 对于任何示例,请尝试找到具有方法定义的解决方案,但您必须按实际情况更改测试代码中的某些内容。
我需要构建一些非常重复的 rspec 测试,并想稍微干燥一下。
describe 'filter' do
let!(:filter_1) { create :filterable, value: 1 }
let!(:filter_2) { create :filterable, value: 2 }
let!(:filter_3) { create :filterable, value: 3 }
let!(:filter_4) { create :filterable, value: 4 }
expected = {
a: filter_1,
b: filter_2,
c: filter_3,
d: filter_4
}
expected.each do |filter, expected|
describe "by #{filter}" do
let(:expected) { [ expected ] }
it "shows only #{filter}" do
get :index, filter: filter
expect(assigns[:filters]).to match_array expected
end
end
end
end
我主要是用我的过滤器和预期结果定义一个散列,然后为每个过滤器构建一个测试。
问题是如何在散列中指定预期结果。
此示例引发错误:
rspec-core-3.4.4/lib/rspec/core/example_group.rb:667:in `method_missing': `filter_1`
is not available on an example group (e.g. a `describe` or `context` block).
It is only available from within individual examples (e.g. `it` blocks)
or from constructs that run in the scope of an example (e.g. `before`, `let`, etc).
(RSpec::Core::ExampleGroup::WrongScopeError)```
I think the memoized variables are only available within an `it` block.
how could I solve this?
thanks,
describe 'filter' do
expected_filters = -> () do
filter_1 = '1'
filter_2 = '2'
{ a: filter_1, b: filter_2 }
end
expected_filters.().each do |filter, expected|
describe "by #{filter}" do
it "shows only #{filter}" do
expect(filter).to be_instance_of(Symbol)
expect(expected).to be_instance_of(String)
end
end
end
end
但是如果您需要 Let!
中的代码是 运行 对于任何示例,请尝试找到具有方法定义的解决方案,但您必须按实际情况更改测试代码中的某些内容。