relishapp docs提到let
的值缓存在同一个示例中:
使用let来定义memoized帮助器方法。该值将被缓存 在同一个示例中跨多个调用但不跨越示例。
它没有确切地说出“示例”是什么,但我将其视为最顶层的describe
或context
块。那是对的吗?如果是这样,您是否可以链接到明确声明的文档?
在其他地方,文档会注意以下内容:
describe方法创建一个示例组。在块内通过 描述你可以使用describe或声明嵌套组 上下文方法,或者您可以使用它或指定声明示例 方法
“{example}”块是context/describe
块还是it
块?简而言之,let
值的范围究竟是什么:it
或context/describe
?
答案 0 :(得分:1)
例如,它表示规格树中的leaf
查看这些组成的规格:
RSpec.describe MyClass do
let(:x) { 1+2+3 }
describe '#foo'
context 'when x happens'
specify do
expect(subject.foo).to eq(x)
end
end
specify do
expect(subject.foo).not_to eq(x)
expect(subject.foo).not_to eq(x+1)
end
end
end
x
将为每个specify
块计算一次且仅计算一次。如果你在里面多次使用它(比如示例中的第二个specify
。第二种用法只是检索记忆值(1+2+3
将不再计算)。
但是对于每个specify
,将计算该值(除非未使用它,因为let
也被延迟评估)
您还询问let
的范围,这是不同的:范围(在此定义元素可用的范围内)是您定义它的块。它会向下冒泡到每个{ {1}}阻止它内部。
答案 1 :(得分:0)
一个例子是it块,你可以通过看到它之间阻止let值没有被缓存和重新填充来相当容易地看到它。
你引用的第二段描述为创建一组“例子”。