unit-testing - rspec 一次构建许多测试,记忆变量的问题
问题描述
我需要构建一些非常重复的 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!
为任何示例运行代码,请尝试找到具有方法定义的解决方案,但您必须按实际情况更改测试代码中的某些内容。
推荐阅读
- html - 为什么我在这里看不到 google 的应用程序图标?
- sql - 如何在 Big Query 中配置的 SQL 中计算递归总和
- mysql - 对相似的 URL 进行分组
- retrofit2 - 改造 2 错误 - 第 1 行第 1 列路径 $ 输入结束
- android - 如何在颤动中播放系统声音
- c++ - 是否有替代方法来输入枚举类型变量而不是使用 static_cast
- mysql - 比较同一张表上两次选择的结果
- excel - 如何将多个文本框值合并到 1 个文本框中,除了跳过空值和 vbNewLine
- java - 如何访问 HttpMessageNotReadableException 中的 _path 属性
- python-3.x - 如何在 jupyter notebook 中获取绘图图?