Как отключить наблюдателя через настройку конфигурации (а не через spec_helper)

Я создал наблюдателя, который следит за всеми моделями на предмет изменений в базе данных. Этот одитор-наблюдатель отлично работает сам по себе, но разрушает набор тестов. Мне неясно, почему наблюдатель приводит к сбою всех моих тестов. Если вы знаете, пожалуйста, скажите мне. (Между прочим, я использую Rails 3.2.14.)

Но что еще более важно, я ищу способ заставить этого наблюдателя хорошо работать с набором тестов. Я думал о добавлении какого-то флага на уровень конфигурации среды, который класс наблюдателя может оценивать во время выполнения. Затем я бы просто установил флаг «false» для среды разработки и тестирования и true для рабочей среды. Но я понятия не имею, как я буду это делать. Какие-либо предложения?

У меня нет возможности отключить наблюдателя в моем spec_helper, потому что значительное количество тестов на самом деле не загружает spec_helper. Большинство этих тестов на самом деле не вносят изменений в базу данных, но гипотетически они могут, а я не хочу копаться в сотнях тестовых файлов для их рефакторинга.

Итак, я ищу способ отключить или вывести из строя моего наблюдателя для всей тестовой среды. Уровень конфигурации кажется подходящим местом для этого, но я не уверен, как это сделать. Я хотел бы услышать любые советы о том, как это сделать.

Обновление: связанный пост с более подробным описанием проблем, с которыми я сталкиваюсь: https://stackoverflow.com/questions/18321693/how-to-disable-an-activerecord-observer-in-a-rails-engine?noredirect=1#comment26888767_18321693


person Ben Downey    schedule 18.08.2013    source источник


Ответы (1)


Я бы сказал:

  • либо вы объявляете наблюдателя во всех файлах конфигурации, кроме тестового

  • или вы загружаете его условно: config.active_record.observers = your_list if Rails.env.test?

Кстати, это кажется странным, вам не нужно его указывать. В любом случае, я знаю, что вы не можете обобщить логику своего приложения, просто любопытно.

person apneadiving    schedule 18.08.2013
comment
Я не уверен, что любая из этих стратегий сработает, поскольку класс наблюдателя будет автоматически загружаться при инициализации приложения. - person Ben Downey; 19.08.2013
comment
Вы действительно пробовали? - person apneadiving; 19.08.2013
comment
что говорится в документе: For an observer to be active, it must be registered first. This can be done by adding the following line into the application.rb - person apneadiving; 19.08.2013
comment
Да, я пробовал не регистрировать наблюдателя. Я добавил оператор печати внутри класса и наблюдал, как он появляется при инициализации тестового приложения. - person Ben Downey; 19.08.2013
comment
Ага. Даже когда я сокращаю файл наблюдателя до класса, наследуемого от ActiveRecord::Observer, т. е. без каких-либо обратных вызовов, тесты терпят неудачу. Само существование файла вызывает следующее исключение: «невозможно преобразовать nil в массив». - person Ben Downey; 19.08.2013
comment
ОБНОВЛЕНИЕ: документ rails не является неправильным. Вместо этого... я идиот. Я переопределял ActiveRecord::Base в своих тестах. Я бомж. - person Ben Downey; 20.08.2013