Как протестировать ассоциации моделей Rails

Пытаюсь протестировать модуль. Работает, когда выполняется в консоли rails, но не когда написано как тест. Предположим следующее:

  1. MyModel

    а) has_many: my_other_model

  2. 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
Другие вопросы по тегам