按照factory_girl_rails文档:这里是factory_girl的区别build()
和create()
方法:创建一个记录似乎并不坚持到测试数据库,RSpec的,factory_girl_rails
#返回的用户实例,这不是保存
用户=版本(:用户)
#返回已保存的用户实例
用户=创建(:用户)
我知道工厂的强大之处在于它让你的测试套件快,因为它可以让你无需通过build()
方法触摸数据库运行在所有的测试。另一方面,create()
方法仍会触摸数据库,因为它将记录保留到数据库中。
我很困惑,因为当我使用create()
- 后把我的测试中一个破发点的轨道控制台说,对象持久化到数据库(预期)
- 的
test/test.log
秀该对象被坚持到数据库(如预期) 但是,当我看着测试数据库内的表:它不存在(不是预期的。我希望看到在数据库中的对象)
#someApp/spec/models/user_spec.rb RSpec.describe User, type: :model do it "checks the age on the basic 'User' Factory " do user = create(:user) # should create a user and persist it to the database binding.pry expect(user.age).to eq(28) end end
执行停止在断点和轨道控制台打开。我测试的持久性和它返回true:
user.persisted?
=> true
不过,我看看表我的测试数据库中,刷新表,但仍然没有显示记录:
什么我错过了吗?我认为,当你使用create()
时,记录将被保存到数据库中。它实际上没有保存到数据库吗?
hmm。我想我一直在想,既然我的'binding.pry'在事务中,我可以在事务尚未完成之前回滚表中的对象。我想这是不可能的? – Neil
不,因为正如我所说的那样,在交易中还没有提交的行从外面看不见。 –