在 rspec-rails 中,"let" VS "let!" 之间的区别



我已经在谷歌上搜索了这个问题,但仍然不清楚。我知道(: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中,并且测试将通过。

最新更新