Подтвердить что ты не робот

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".

4b9b3361

Ответ 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 отмечен как устаревший.