我通过一个非常简单的例子理解了let
和之间的区别。let!
让我先阅读文档句子,然后动手展示输出。
关于让医生说:-
...let
是惰性求值的:直到它定义的方法第一次被调用时才求值。
我了解以下示例的区别:-
$count = 0
describe "let" do
let(:count) { $count += 1 }
it "returns 1" do
expect($count).to eq(1)
end
end
现在让我们运行它:-
arup@linux-wzza:~/Ruby> rspec spec/test_spec.rb
F
Failures:
1) let is not cached across examples
Failure/Error: expect($count).to eq(1)
expected: 1
got: 0
(compared using ==)
# ./spec/test_spec.rb:8:in `block (2 levels) in <top (required)>'
Finished in 0.00138 seconds (files took 0.13618 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/test_spec.rb:7 # let is not cached across examples
arup@linux-wzza:~/Ruby>
为什么是错误?因为,正如 doc 所说,在第一次调用它定义的方法之前let
,它不会被评估。在示例中,我们没有调用,因此仍然是,没有增加。count
$count
0
1
现在来到这个部分let!
。医生说
....您可以使用让!在每个示例之前强制调用方法。这意味着即使您没有在示例中调用辅助方法,它仍然会在您的示例运行之前被调用。
让我们也测试一下:-
这是修改后的代码
$count = 0
describe "let!" do
let!(:count) { $count += 1 }
it "returns 1" do
expect($count).to eq(1)
end
end
让我们运行这段代码:-
arup@linux-wzza:~/Ruby> rspec spec/test_spec.rb
.
Finished in 0.00145 seconds (files took 0.13458 seconds to load)
1 example, 0 failures
看,现在$count
返回1
,因此测试通过了。它发生在我使用的时候let!
,它在示例运行之前运行,尽管我们没有count
在示例中调用。
这就是彼此的方式let
和不同之处。let!