我已经在谷歌上搜索了这个问题,但仍然不清楚。我知道(:let)是延迟求值的,如果你不调用它,它永远不会被实例化,而(:let!)在每次方法调用之前都是强制求值的。
let(:article) = { Article.new(name: 'article1') }
let!(:article) = { Article.new(name: 'article1') }
任何人都能解释更多吗?使用let有什么好处!
有时您希望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
对象将在expect
之前就已经存在于Article.count
中,并且测试将通过。