Rails 6 Testing - инициализаторы и динамические данные c с Minitest - PullRequest
0 голосов
/ 22 апреля 2020

В настоящее время я пишу тесты для моего 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, так что не будь слишком усердным :).

...