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

Nei*_*eil 4 ruby rspec ruby-on-rails rspec-rails factory-bot

根据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
    
    Run Code Online (Sandbox Code Playgroud)

执行在断点处停止,并且rails控制台打开.我测试持久性,它返回true:

user.persisted? 
  => true
Run Code Online (Sandbox Code Playgroud)

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

记录不会显示在表格中

我错过了什么?我以为当你使用create()记录时会被持久化到数据库中.它实际上根本没有保存到数据库中吗?

Mik*_*del 11

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