首页 文章

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

提问于
浏览
1

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

使用let定义memoized辅助方法 . 该值将在同一示例中的多个调用之间缓存,但不跨示例缓存 .

它并不意味着最重要的 describecontext 块 . 那是对的吗?如果是这样,您是否可以链接到明确声明的文档?

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

describe方法创建一个示例组 . 在传递给描述的块中,您可以使用describe或context方法声明嵌套组,或者您可以使用它声明示例或指定方法 .

"example"是 context/describe 块,还是 it 块?简而言之, let 值的范围究竟是什么: it ,或 context/describe

2 回答

  • 1

    例如,它表示您的specs树中的 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 . 第二种用法只是检索memoized值( 1+2+3 将不再计算) .

    但是对于每个 specify ,将计算该值(除非它未被使用,因为 let 也被懒惰地评估)

    您还会询问 let 的范围,这是不同的:范围(在此定义元素可用的范围内)是您定义它的块 . 它会向下冒泡到其中的每个 it/specify 块 .

  • 0

    一个例子是它的块,你可以通过看到它之间阻止let值没有被缓存和重新填充来相当容易地看到它 .

    您引用的第二段描述为创建示例的“组” .

相关问题