【问题标题】:Creating a record does not appear to persist to the test database, rspec, factory_girl_rails创建记录似乎不会持久化到测试数据库、rspec、factory_girl_rails
【发布时间】:2016-01-22 16:35:42
【问题描述】:

根据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

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

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

【问题讨论】:

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


    【解决方案1】:

    RSpec 在事务中运行测试。这意味着在测试开始之前打开事务,在测试完成之后回滚。这样测试与数据库接口,但从事务外部看不到数据(所以从外部 RSpec 进程)

    【讨论】:

    • 嗯。我想我在想,由于我的binding.pry 在事务中,因此我可以在表中的对象回滚之前查看表中的对象,因为事务尚未完成。我想这是不可能的?
    • 不,因为正如我所说,尚未提交的“事务中”行从外部是不可见的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多