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的解释一起结束了这个问题.
好问题,我认为这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'
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |