创建记录似乎不会持久存储到测试数据库rspec,factory_girl_rails

时间:2016-01-22 16:35:42

标签: ruby-on-rails ruby rspec factory-bot rspec-rails

根据factory_girl_rails文档:这是factory_girl build()create()方法之间的区别:

  

#返回未保存的用户实例

     

user = build(:user)

     

#返回已保存的用户实例

     

user = create(:user)

我知道工厂的强大之处在于它们使您的测试套件快速运行,因为它允许您运行测试而无需通过build()方法触摸数据库。另一方面,create()方法仍会触及数据库,因为它会将记录持久保存到数据库中。

我很困惑,因为我在使用create()

后在测试中设置了一个断点
  • rails控制台说该对象持久保存到数据库(正如预期的那样)
  • 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

但是,我查看表中的测试数据库,刷新表,但仍然没有显示记录:

record does not display in table

我错过了什么?我认为当你使用create()时,记录将被保存到数据库中。它实际上根本没有保存到数据库吗?

1 个答案:

答案 0 :(得分:10)

RSpec在交易中运行测试。这意味着在测试开始之前,会打开一个事务,在完成测试之后,它会回滚。这样,测试与数据库接口,但是没有数据可以从事务外部看到(因此来自外部RSpec进程)