我用Google搜索了这个问题,但仍然不清楚。我得到(:let)被懒惰地评估,如果你不调用它将永远不会被实例化,而(:let!)在每个方法调用之前被强制评估。
let(:article) = { Article.new(name: 'article1') }
let!(:article) = { Article.new(name: 'article1') }
任何机构都能解释得更多,使用let有什么好处!
答案 0 :(得分:3)
有时您希望let
的间接结果出现。
例如......
let(:article) = { Article.create(name: 'article1' }
it "does not add an article with a duplicate name" do
expect(Article.create(name: article.name)).not_to change(Article.count)
end
这实际上会失败,因为测试前的Article.count
将不包含article
对象,因为它尚未创建,直到它被引用。因此,即使未创建新文章(具有重复名称的文章),测试仍会检测到对Article.count
的更改
现在,如果你这样做......
let!(:article) = { Article.create(name: 'article1' }
it "does not add an article with a duplicate name" do
expect(Article.create(name: article.name)).not_to change(Article.count)
end
article
对象在Article.count
之前已经存在expect
,测试将通过。