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