如何在 RSpec/Capybara 测试中更改配置?

How to make configuration changes in RSpec/Capybara tests?

我正在尝试使用 RSpec 和 Capybara 编写功能规范,它在两种类型 session_stores 之间变化:cookie_store 和 active_record_store,并希望用户即使我们从 active_record_store 切换到 cookie_store,仍保持登录状态。基本上出于某些原因,我正在从 active_record_store 切换到 cookie_store 并且想看看无论配置如何更改,会话是否仍然存储。

这是我的 session_store.rb 文件:

# Be sure to restart your server when you modify this file.

Project::Application.config.session_store :cookie_store, :key => '_project_session'

这是我的规格:

 describe "Admin logged into" do
    it 'shows the correct interface for logged in users' do
      # ---> Here use active_record_store:
      # Project::Application.config.session_store :active_record_store
      log_in_admin(admin)
      visit candy_shop_path
      expect(page.current_path).to eq(candy_shop_path)
 

      # --> Here switch to cookie_store
      # Project::Application.config.session_store :cookie_store, :key => '_project_session'
      visit candy_shop_path
      expect(page.current_path).to eq(candy_shop_path)
    end
  end

我需要有关注释掉的部分的帮助。我不确定如何配置 RSpec 先使用 :active_record_store 然后切换到 :cookie_store.

Capybara 并不真正支持这一点,因为正如您在 session_store.rb 中的评论中看到的那样,应用确实需要重新启动才能使任何更改生效。您可以通过让 session_store.rb 基于环境变量设置它的值然后在 page.server 处操纵 Capybara::Server 实例以使其重新启动应用程序来使类似的东西工作测试,但它会是一个严重的 hack,我真的不推荐它用于测试目的。

注意:你永远不应该做 expect(page.current_path).to eq(candy_shop_path)。这将导致不稳定的测试和挫败感。基本上你不应该在处理 Capybara 对象时使用标准的 RSpec 匹配器(eq 等),而是使用 Capybara 提供的匹配器,在这种情况下是 expect(page).to have_current_path(candy_shop_path).