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

lll*_*lll 2 rspec ruby-on-rails factory-bot

我和Nick Rutten在这个线程Rails教程中遇到了同样的问题:RSpec测试解耦.我怀疑问题是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
Run Code Online (Sandbox Code Playgroud)

我明白了:

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
Run Code Online (Sandbox Code Playgroud)

我一直试图理解为什么计数器没有增加,这不是它开始增加的问题吗?谢谢

使用@ 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
Run Code Online (Sandbox Code Playgroud)

但是现在我得到两个值1:

Number of users:1
Number of users:1
Run Code Online (Sandbox Code Playgroud)

关闭,但还没有!

编辑2

正如@Peter Alfvin在这里解释的那样:在一个给定的RSpec描述块中,let之前的顺序和它的语句是否重要?.的顺序let,before,it是相当多建立,无论代码.这与@ derekyau的解释一起结束了这个问题.

der*_*yau 7

好问题,我认为这let(:user)是懒惰的评估,所以直到你在它的块内使用它才实际调用它.

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

let!(:user) {FactoryGirl.create(:user)}
Run Code Online (Sandbox Code Playgroud)

如果你想看到它改变尝试做一个"它阻止"的内部

it "check user count" do
  puts User.count
end
Run Code Online (Sandbox Code Playgroud)

你应该看'1'