FactoryGirl.create不会增加`.count`字段

时间:2013-09-13 22:51:10

标签: ruby-on-rails rspec factory-bot

我和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?。无论代码如何,letbeforeit的顺序都已基本确定。这与@ derekyau的解释一起结束了这个问题。

1 个答案:

答案 0 :(得分:7)

好问题,我认为let(:user)被懒惰地评估,所以直到你在它的块中使用它才会被实际调用。

如果你想强制进行评估,请试试!

let!(:user) {FactoryGirl.create(:user)}

如果你想看到它的变化,试着把它放在“它阻止”

it "check user count" do
  puts User.count
end

你应该看到'1'