rspec:quot;的确切含义是什么;例如;对于'let'的缓存?

rspec:quot;的确切含义是什么;例如;对于'let'的缓存?,rspec,Rspec,提到let的值在同一示例中被缓存: 使用let定义已记忆的辅助对象方法。该值将被缓存 跨同一示例中的多个调用,但不跨示例 它并没有确切地说明什么是“示例”,但我认为它是指最顶层的描述或上下文块。对吗?如果是这样的话,您能否链接到明确说明这一点的文档 在其他地方,文件注意到以下内容: descripe方法创建一个示例组。在经过的街区内 要进行描述,可以使用描述或 上下文方法,或者您可以使用它声明示例或指定 方法 那么,“示例”是context/descripe块还是it块呢?简而言之,let值的范

提到
let
的值在同一示例中被缓存:

使用let定义已记忆的辅助对象方法。该值将被缓存 跨同一示例中的多个调用,但不跨示例

它并没有确切地说明什么是“示例”,但我认为它是指最顶层的
描述
上下文
块。对吗?如果是这样的话,您能否链接到明确说明这一点的文档

在其他地方,文件注意到以下内容:

descripe方法创建一个示例组。在经过的街区内 要进行描述,可以使用描述或 上下文方法,或者您可以使用它声明示例或指定 方法


那么,“示例”是
context/descripe
块还是
it
块呢?简而言之,
let
值的范围究竟是什么:一个
it
,或者一个
context/description

一个例子是一个it块,你可以很容易地看到,在它的块之间,let值没有被缓存和重新填充


您引用的第二段提到创建一组示例。

示例是指规范树中的

请查看此组合规格:

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
将为每个
指定
块计算一次且仅计算一次。如果您在内部多次使用它(如示例中的第二个
中,请指定
。第二个用法将只是检索记忆值(
1+2+3

但是对于每个
specify
都将计算该值(除非未使用该值,因为
let
也会延迟计算)

您还询问了
let
的作用域,这是不同的:作用域(如定义的元素可用的作用域)是您定义它的块。它向下冒泡到每个
it/指定它里面的