2

我在这个线程Rails Tutorial: RSpec test decoupling中遇到了与 Nick Rutten 相同的问题。我怀疑问题是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 在这里解释的那样:在给定的 RSpec 描述块中,let、before 和 it 语句的顺序是否重要?. let, before,的顺序it几乎是确定的,无论代码如何。这与@derekyau 的解释一起结束了这个问题。

4

1 回答 1

7

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

如果您想强制对其进行评估,请尝试让!

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

如果您想看到它发生变化,请尝试在“it block”中执行 puts

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

你应该看到“1”

于 2013-09-13T22:54:20.303 回答