有没有一种方法可以在同一个示例组中使用let声明相同的helper方法,但让它在不同的期望值中返回不同的值?
它会有点像
describe MyClass do
subject(:my_obj) { described_class.new(my_var) }
describe '#my_method' do
context 'some context' do
let(:my_var) { 0 }
# expectation that involves my_var
let(:my_var) { 1 }
# expectation that involves my_var
end
end
end
解决方案是为每个期望提供不同的上下文,但有可能在不添加更多上下文的情况下解决这个问题吗?
也许您可以定义一个数组并对其进行迭代,简单地说:
describe MyClass do
subject(:my_obj) { described_class.new(my_var) }
describe '#my_method' do
context 'some context' do
[0,1].each do |n|
let(:my_var) { n }
# expectation that involves my_var
end
end
end
end
您可以将对let
块中的示例对象及其元数据的访问与测试元数据结合使用:
let(:my_var) do |example|
example.metadata[:my_var]
end
context 'some context' do
it "my_var is 0", my_var: 0 do # <= here we set the necessary metadata
...
end
it "my_var is 1", my_var: 1 do # <= ... and again
...
end
end
...
与显式子上下文不同,这种编写规范的方式相对较少使用,因此它为第一次阅读此代码的人增加了一些心理开销。但问题是,深度嵌套的上下文并不是;免费的";或者(在一些嵌套级别上,很难理解发生了什么(,所以用一些";魔术;可能有意义,具体取决于用例。就我个人而言,如果可以的话,我会使用子上下文,只有在必须的情况下,我才会使用一些白色魔法。。。