示例组内部的同一个辅助方法的多个let声明



有没有一种方法可以在同一个示例组中使用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
...

与显式子上下文不同,这种编写规范的方式相对较少使用,因此它为第一次阅读此代码的人增加了一些心理开销。但问题是,深度嵌套的上下文并不是;免费的";或者(在一些嵌套级别上,很难理解发生了什么(,所以用一些";魔术;可能有意义,具体取决于用例。就我个人而言,如果可以的话,我会使用子上下文,只有在必须的情况下,我才会使用一些白色魔法。。。

最新更新