rspec:对于`let`的缓存,“example”的确切含义是什么?

时间:2017-10-26 18:44:41

标签: rspec

relishapp docs提到let的值缓存在同一个示例中:

  

使用let来定义memoized帮助器方法。该值将被缓存   在同一个示例中跨多个调用但不跨越示例。

它没有确切地说出“示例”是什么,但我将其视为最顶层的describecontext块。那是对的吗?如果是这样,您是否可以链接到明确声明的文档?

在其他地方,文档会注意以下内容:

  

describe方法创建一个示例组。在块内通过   描述你可以使用describe或声明嵌套组   上下文方法,或者您可以使用它或指定声明示例   方法

“{example}”块是context/describe块还是it块?简而言之,let值的范围究竟是什么:itcontext/describe

2 个答案:

答案 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值没有被缓存和重新填充来相当容易地看到它。

你引用的第二段描述为创建一组“例子”。