根据factory_girl_rails文档:这是factory_girl build()
和create()
方法之间的区别:
#返回未保存的用户实例
user = build(:user)
#返回已保存的用户实例
user = create(:user)
我知道工厂的强大之处在于它们使您的测试套件快速运行,因为它允许您运行测试而无需通过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
执行在断点处停止,并且rails控制台打开。我测试持久性并返回true:
user.persisted?
=> true
但是,我查看表中的测试数据库,刷新表,但仍然没有显示记录:
我错过了什么?我认为当你使用create()
时,记录将被保存到数据库中。它实际上根本没有保存到数据库吗?
答案 0 :(得分:10)
RSpec在交易中运行测试。这意味着在测试开始之前,会打开一个事务,在完成测试之后,它会回滚。这样,测试与数据库接口,但是没有数据可以从事务外部看到(因此来自外部RSpec进程)