创建记录似乎不会持久保存到测试数据库,rspec,factory_girl_rails
Creating a record does not appear to persist to the test database, rspec, factory_girl_rails
根据 factory_girl_rails 文档:这是 factory_girl build()
和 create()
方法之间的区别:
# Returns a User instance that's not saved
user = build(:user)
# Returns a saved User instance
user = create(:user)
我知道工厂的力量在于它们可以使您的测试套件更快,因为它允许您 运行 测试而无需通过 build()
方法接触数据库。另一方面,create()
方法仍然会接触数据库,因为它将记录保存到数据库中。
我很困惑,因为当我在使用 create()
后在我的测试中放置一个断点时
- rails 控制台显示对象已持久化到数据库中(如预期)
test/test.log
显示对象已持久化到数据库中(如预期)
但是当我查看测试数据库中的 table 时:它不存在 (预计不会。我希望在数据库中看到该对象)
#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 控制台打开。我测试了持久性,结果 returns true:
user.persisted?
=> true
但是,我在 table 的测试数据库中查看,刷新 table,但仍然没有显示任何记录:
我错过了什么?我认为当您使用 create()
时,记录将保存到数据库中。它实际上根本不保存到数据库吗?
RSpec 在事务中运行测试。这意味着在测试开始之前打开一个事务,在测试完成之后回滚。这样,测试与数据库接口,但从事务外部看不到数据(因此从 RSpec 进程外部)
根据 factory_girl_rails 文档:这是 factory_girl build()
和 create()
方法之间的区别:
# Returns a User instance that's not saved
user = build(:user)
# Returns a saved User instance
user = create(:user)
我知道工厂的力量在于它们可以使您的测试套件更快,因为它允许您 运行 测试而无需通过 build()
方法接触数据库。另一方面,create()
方法仍然会接触数据库,因为它将记录保存到数据库中。
我很困惑,因为当我在使用 create()
- rails 控制台显示对象已持久化到数据库中(如预期)
test/test.log
显示对象已持久化到数据库中(如预期)但是当我查看测试数据库中的 table 时:它不存在 (预计不会。我希望在数据库中看到该对象)
#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 控制台打开。我测试了持久性,结果 returns true:
user.persisted?
=> true
但是,我在 table 的测试数据库中查看,刷新 table,但仍然没有显示任何记录:
我错过了什么?我认为当您使用 create()
时,记录将保存到数据库中。它实际上根本不保存到数据库吗?
RSpec 在事务中运行测试。这意味着在测试开始之前打开一个事务,在测试完成之后回滚。这样,测试与数据库接口,但从事务外部看不到数据(因此从 RSpec 进程外部)