我和Nick Rutten在这个帖子Rails Tutorial: RSpec test decoupling中遇到了同样的问题。我怀疑问题是FactoryGirl.create()
保存到数据库,感谢@prusswan我修复了它。
但是,我不明白为什么这些puts
不表示不同的User.count
。
这是我感兴趣的片段:
describe "with valid information" do
puts "Number of users pre-Factory:" + User.count.to_s
let(:user){FactoryGirl.create(:user)}
puts "Number of users post-Factory:" + User.count.to_s
(...)
end
我明白了:
Number of users pre-Factory:0
Number of users post-Factory:0
但是我不应该这样做?:
Number of users pre-Factory:0
Number of users post-Factory:1
顺便说一句,工厂被定义为(虽然现在不那么重要):
FactoryGirl.define do
factory :user do
name "Example User"
email "user@example.com"
password "foobar"
password_confirmation "foobar"
end
end
我一直试图理解为什么计数器没有增加,这不是它开始增加的问题吗? 谢谢
使用@ derekyau的建议进行编辑:
现在我已经按此顺序了:
it "print counter before let"
puts "Number of users:" + User.count.to_s
end
let(:user){FactoryGirl.create(:user)}
it "print counter after let"
puts "Number of users:" + User.count.to_s
end
但是现在我得到两个值1:
Number of users:1
Number of users:1
关闭但不存在!
修改2
@Peter Alfvin在此解释:Within a given RSpec describe block, does the order of let, before and it statements matter?。无论代码如何,let
,before
,it
的顺序都已基本确定。这与@ derekyau的解释一起结束了这个问题。
答案 0 :(得分:7)
好问题,我认为let(:user)
被懒惰地评估,所以直到你在它的块中使用它才会被实际调用。
如果你想强制进行评估,请试试!
let!(:user) {FactoryGirl.create(:user)}
如果你想看到它的变化,试着把它放在“它阻止”
中it "check user count" do
puts User.count
end
你应该看到'1'