Я пытался решить проблему в течение нескольких недель. Я запускаю rspec-тесты для моего приложения Rails, и они работают нормально, за исключением одной ошибки, с которой я не могу покаться.Rails test db не сохраняет записи изменений
- Я использую MySQL с движком InnoDB.
- Я установил
config.use_transactional_fixtures = true
в spec_helper.rb - Я загружаю свои испытательные приборы вручную с помощью команды
rake spec:db:fixtures:load
. - Тест rspec записывается для рабочего BackgrounDRb, и он тестирует, что запись может обновить его состояние (через goss state_machine).
Вот моя проблема:
У меня есть модель под названием Listings
. Тест rspec вызывает метод update_sold_items
в файле с именем listing_worker.rb
. Этот метод вызывает listing.sell
для конкретной записи, которая устанавливает столбец состояния состояния записи «продано». До сих пор это все работает нормально, но когда метод update_sold_items
заканчивает мой RSpec тест не пройден здесь:
listing = Listing.find_by_listing_id(listing_id)
listing.state.should == "sold"
expected: "sold",
got: "current" (using ==)
Я пытался выяснить, почему изменение состояния не сохраняющиеся, но я довольно много потерял. Вот результат некоторой отладки кода, который я поместил в методе update_sold_items
во время теста:
pp listing.state # => "current"
listing.sell!
listing.save!
pp listing.state # => "sold"
listing.reload
pp listing.state # => "current"
Я не могу понять, почему это экономит прекрасно, но затем возвращается к исходной записи всякий раз, когда я называю reload
или Listing.find
и т. д.
Спасибо, что прочитали это и, пожалуйста, задавайте любые вопросы, если я не дал достаточно информации.
Спасибо за вашу помощь, Nathan B
P.S. У меня нет проблем с созданием новых записей для других классов и тестированием этих записей. Это только кажется проблемой, когда я обновляю записи, которые уже существуют в базе данных.
Не перезаписывайте ли транзакционные приборы при ROLLBACK при перезагрузке? Все в транзакции, чтобы они могли сбросить данные перед каждым тестом. Эта перезагрузка/ROLLBACK будет в исходном состоянии, а не в сохраненном состоянии, да? Почему вы его перезагружаете? – wesgarrison
хорошо пункт. Я не был на 100% уверен, как работает транзакция. Спасибо за вашу помощь! – ndbroadbent