Создание записи не сохраняется в тестовой базе данных, rspec, factory_girl_rails

Согласно документации factory_girl_rails: вот разница между factory_girl build() и create() методы:

# Возвращает экземпляр пользователя, который не сохранен

пользователь = сборка (: пользователь)

# Возвращает сохраненный экземпляр пользователя

пользователь = создать (: пользователь)

Я знаю, что сила фабрик в том, что они делают ваш набор тестов быстрым, потому что он позволяет запускать тесты, вообще не касаясь базы данных с помощью метода 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
    

Выполнение останавливается в точке останова, и консоль рельсов открывается. Я проверяю настойчивость, и она возвращает истину:

user.persisted? 
  => true

Тем не менее, я просматриваю таблицу в своей тестовой базе данных, обновляю таблицу, но по-прежнему никакая запись не отображается:

запись не отображается в таблице

Что мне не хватает? Я думал, что когда вы используете create(), запись будет сохранена в базе данных. Неужели вообще не сохраняется в базе данных?


person Neil    schedule 22.01.2016    source источник


Ответы (1)


RSpec выполняет тесты в транзакциях. Это означает, что перед запуском теста транзакция открывается, а после завершения теста выполняется откат. Таким образом, тест взаимодействует с БД, но данные не видны извне транзакции (т.е. извне процесса RSpec)

person Mike Szyndel    schedule 22.01.2016
comment
Хм. Думаю, я думал, что, поскольку мой binding.pry находился внутри транзакции, я смогу взглянуть на объект в таблице до его отката, поскольку транзакция еще не была завершена. Полагаю, это невозможно? - person Neil; 22.01.2016
comment
Нет, потому что, как я уже сказал, строки в транзакции, которые еще не были зафиксированы, невидимы снаружи. - person Mike Szyndel; 22.01.2016