В настоящее время я пишу тесты для моего Rails-приложения, используя стандартную среду Minitest, и она работает довольно хорошо. Единственная проблема, с которой я столкнулся - мой инициализатор конфигурации запускается (я думаю) каждый тест дважды, и я не могу понять, почему это происходит.
Итак, у меня есть инициализатор, который устанавливает некоторые параметры конфигурации из базы данных для мое приложение:
# config/initializers/load_application_settings.rb
Rails.configuration.after_initialize do
if defined?(::Rails::Server) && !Rails.env.test?
WebMenueNew::Application.config.header_title = "WebMenue | #{Configuration.first.clinicName}"
WebMenueNew::Application.config.clinic_name = Configuration.first.clinicName
WebMenueNew::Application.config.clinic_location = Configuration.first.city
WebMenueNew::Application.config.proxy_server = Configuration.first.request_server
WebMenueNew::Application.config.order_time = Configuration.first.orderTime.strftime('%H:%M')
WebMenueNew::Application.config.repeating_period = Configuration.first.repeatMealTime
WebMenueNew::Application.config.clinic_iban = Configuration.first.iban
WebMenueNew::Application.config.clinic_bic = Configuration.first.bic
WebMenueNew::Application.config.clinic_bank = Configuration.first.bank
end
end
Я пытался обернуть его при условии if !Rails.env.test?
, но, похоже, оно не работает. В моем тесте контроллера я попытался инициализировать значение в методе настройки и уничтожить все параметры в методе разрыва:
require 'test_helper'
class SessionsControllerTest < ActionDispatch::IntegrationTest
setup do
Rails.configuration.clinic_name = "BDH-Klinik Braunfels"
@user = users(:one)
end
test "should get new" do
get root_path
assert_response :success
assert_select "title", "WebMenue | BDH-Klinik Braunfels"
end
test "should be valid external login" do
post login_path, params: { session: { using_ldap: false, username: @user.email, password: "valid_password" } }
assert_response :redirect
assert_redirected_to @user
end
teardown do
Configuration.destroy_all
end
end
Даже если я переместил его из метода настройки в метод теста для новое действие, он всегда создает две записи в тестовой базе данных, и я получаю следующую ошибку:
Minitest :: UnexpectedError: ActiveRecord :: RecordNotUnique: PG :: UniqueViolation: ERROR: значение дубликата ключа нарушает уникальное ограничение "configurations_pkey" ДЕТАЛИ: Ключ (id) = (980190962) уже существует.
В моем новом представлении для контроллера сессий я динамически устанавливаю заголовок приложения, поэтому мне нужен параметр:
<% content_for(:title) { "WebMenue | #{Rails.configuration.clinic_name}" } %>
Есть ли обходной путь, чтобы инициализатор не запускался на тестовых наборах? Или я что-то упустил? Я относительно новичок в тестировании в Rails, так что не будь слишком усердным :).