在rspec-rails中," let" VS"让!"

时间:2015-12-28 09:50:55

标签: ruby-on-rails-4 rspec-rails

我用Google搜索了这个问题,但仍然不清楚。我得到(:let)被懒惰地评估,如果你不调用它将永远不会被实例化,而(:let!)在每个方法调用之前被强制评估。

let(:article) = { Article.new(name: 'article1') }
let!(:article) = { Article.new(name: 'article1') }

任何机构都能解释得更多,使用let有什么好处!

1 个答案:

答案 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,测试将通过。