【发布时间】:2015-08-21 00:55:51
【问题描述】:
我正在阅读 The Rails 4 Way 这本书,并且正在学习 Rspec。我知道惰性求值是在使用表达式之前不求值,而急切求值是立即求值表达式。 let 使用惰性求值,在使用 let 变量之前不会执行块中的表达式。而let! 使用热切评估。
但是,我对 rspec 中的 let 和 let! 仍然有些困惑。让我们以书中的例子为例:
describe BlogPost do
let(:blog_post) { BlogPost.create title: 'Hello' }
let!(:comment) { blog_post.comments.create text: 'first post' }
describe "#comment" do
before do
blog_post.comment("finally got a first post")
end
it "adds the comment" do
expect(blog_post.comments.count).to eq(2)
end
end
end
作者是这样说的:
因为注释块永远不会第一次执行 断言如果您使用 let 定义,则只有一个注释 即使实现可能正在运行,也已在此规范中添加。 通过使用 let!我们确保创建初始评论和规范 现在会过去的。
我认为使用 let 会创建两个 cmets,使用 let! 会创建三个 cmets。为什么?因为使用 let,该块将不会被执行,因此不会在那里创建 cmets。但是,注释将在 before 块中被惰性求值,所以现在我们有一个注释。然后注释块将在“添加注释”块中再次评估,因此将创建两个 cmets。既然让!立即计算,因此将创建 3 个 cmets,而不仅仅是两个。
我在这里误会了什么?
【问题讨论】:
标签: ruby-on-rails ruby rspec