ActsAsTenant current_tenant + Capybara + тестирование RSpec

Я пытаюсь создать интеграционный тест с Capybara/RSpec, который имеет действительный current_user (используя трюк Warden.test_mode!), И я также создал действительный current_tenant, выполнив это в тесте:

ActsAsTenant.current_tenant = Account.first

При запуске теста возникает ошибка "неопределенный метод для nil:NilClass", которая характерна для не установленного current_tenant. Я подтвердил, что Account.first действительно имеет то, что я ожидаю.

В чем может быть проблема и как я могу это исправить?

3 ответа

Вы можете проверить документ gem 'act_as_tent' здесь https://github.com/ErwinM/acts_as_tenant

Хотя этому вопросу уже 8 лет, это единственный релевантный результат, который я нашел при поиске помощи в работе с capybara + rspec, выступающей в качестве арендатора. Надеюсь, это поможет кому-то другому или, что более вероятно, будущему мне, когда я забуду, как я это решил.

Моя проблема заключалась в том, что, хотя официальная документация работала нормально для модульных тестов, она терпела неудачу во время системных тестов, поскольку второй запрос (например, действие обновления или создания) имел нулевой клиент.

В config/environment/test.rb я включаю промежуточное ПО согласно официальной документации, но также заставляю капибару получать доступ к серверу, используя домен localhost.

        config.middleware.use ActsAsTenant::TestTenantMiddleware

  config.after_initialize do
    # Use localhost as the server and app host for Capybara tests
    Capybara.server_host = "localhost"
    Capybara.app_host = "http://localhost"
  end

В Rails_helper.rb я создаю учетную запись с доменом localhost. Фильтр перед набором работает вне транзакции, поэтому его необходимо удалить вручную после завершения набора, что можно сделать в блоке at_exit.

Я также изменил его, проверив тип примера системы и запрос.

        config.before(:suite) do |example|
    $default_account = FactoryBot.create(:account, domain: "localhost")
  end

  config.before(:each) do |example|
    if [:system, :request].include?(example.metadata[:type])
      ActsAsTenant.test_tenant = $default_account
    else
      ActsAsTenant.current_tenant = $default_account
    end
  end

  config.after(:each) do |example|
    ActsAsTenant.current_tenant = nil
    ActsAsTenant.test_tenant = nil
  end

  at_exit do
    $default_account.destroy
  end
end

Возможно, вам потребуется создать Account. Если вы используете FactoryBot, это может выглядеть так:

ActsAsTenant.current_tenant = FactoryBot.create :account

Вы также можете рассмотреть возможность использования:

       ActsAsTenant.without_tenant do
  # more testy things
end
Другие вопросы по тегам