首页 > 解决方案 > 如何在 RSpec/Capybara 测试中进行配置更改?

问题描述

我正在尝试使用 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。

标签: ruby-on-railsrspeccapybarasession-cookies

解决方案


Capybara 并不真正支持这一点,因为正如您从 session_store.rb 中的评论中看到的那样,确实需要重新启动应用程序才能使任何更改生效。您可能可以通过让 session_store.rb 根据环境变量设置它的值,然后操作 Capybara::Server 实例page.server来让它重新启动被测应用程序,但这将是一个严重的黑客攻击我真的不推荐它用于测试目的。

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


推荐阅读