2016-01-22 23 views
3

按照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 

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

record does not display in table

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

回答

7

RSpec在事务中运行测试。这意味着在测试开始之前打开一个事务并且在测试完成之后它会回滚。通过这种方式,测试与数据库交互,但交易外部没有数据可见(因此来自RSpec外部流程)

+0

hmm。我想我一直在想,既然我的'binding.pry'在事务中,我可以在事务尚未完成之前回滚表中的对象。我想这是不可能的? – Neil

+1

不,因为正如我所说的那样,在交易中还没有提交的行从外面看不见。 –

相关问题