Как протестировать ассоциации моделей Rails
Пытаюсь протестировать модуль. Работает, когда выполняется в консоли rails, но не когда написано как тест. Предположим следующее:
MyModel
а) has_many: my_other_model
MyOtherModel
а) принадлежит: my_model
Пример модуля:
module MyModule
def self.doit
mine = MyModel.first
mine.my_other_models.create!(attribute: 'Me')
end
end
Сейчас тестируем:
require 'test_helper'
class MyModuleTest < ActiveSupport::TestCase
test "should work" do
assert MyModule.doit
end
end
Возвращает:
NoMethodError: NoMethodError: undefined method `my_other_models' for nil:NilClass
Теперь попробуйте то же самое в консоли:
rails c
MyModule.doit
Работает просто отлично. Но почему не в качестве теста?
1 ответ
Ваша тестовая база данных пуста, когда вы запускаете этот тест, поэтому вызов MyModel.first
собирается вернуться nil
, затем вы пытаетесь связать неизвестный метод в ноль. То, что вы, вероятно, захотите для своего набора тестов, это приспособление, которое представляет собой просто пример данных. Пока вы можете просто создать первый экземпляр, чтобы тест заработал.
test "should work" do
MyModel.create #assuming the model is not validated
assert MyModule.doit
end
Вы также можете провести рефакторинг вашего модуля. Добавление if mine
будет пытаться создать другие модели, только если моя не ноль. Это позволит пройти тест, но сведет на нет цель вашего теста.
def self.doit
mine = MyModel.first
mine.my_other_models.create!(attribute: 'Me') if mine
end