Rack:: Тест, в результате которого ActiveRecord:: AssociationTypeMismatch
У меня проблема при запуске всех моих спецификаций.
ActiveRecord::AssociationTypeMismatch:
Affiliate(#2154746360) expected, got Affiliate(#2199508660)
Похоже, что мои модели загружаются дважды.
Я выделил проблему, которая будет введена с помощью требования Rack:: Test для определения метода "app".
require 'rack/test'
include Rack::Test::Methods
# app method is needed for rack-test
def app
Rails.application
end
Если я прокомментирую Rails.application
, мои спецификации в стойке не работают, но все мои другие спецификации работают нормально. Использование Rails.application
в методе "app" вводит ошибку выше.
Если я запускаю свои спецификации по отдельности, все работает. Я предварительно загружаю свою среду Spork, и я думаю, что модели загружаются сначала Spork, а затем они переопределяются, когда Rails.application
вызывается в моем методе "app".
Любые идеи о том, как я могу решить эту проблему? Я не уверен, есть ли другой способ установить мое приложение Rails в методе "app".
Ответы
Ответ 1
У меня больше нет этой проблемы. Я обновил свои драгоценные камни. Rails был обновлен с 3.0.5 до 3.0.7, и я бы предположил, что, возможно, это обновление gem, которое исправило мою проблему. В любом случае с новыми версиями драгоценных камней моя проблема исправлена.
Ответ 2
Из исходного кода для Rails.application
:
# File railties/lib/rails.rb, line 34
def application
@@application ||= nil
end
Это означает, что Rails.application
возвращает один и тот же объект каждый раз. Возможно, в этом и проблема - запуск нескольких тестов в одном и том же Rails-приложении сталкивается с объектами.
Некоторые учебники устанавливают такие тесты следующим образом:
def app
Rails::Application
end
В то время как другие делают это следующим образом:
def app
ActionController::Dispatcher.new
end
Оба из них создают новый объект для каждого вызова app
.
EDIT: Только что заметил из журналов, что ActionController::Dispatcher.new
отмечен как устаревший.