我有一个带有 RSpec、Capybara 和 Selenium 以及 Chromium/Chrome 的 Ruby on Rails 应用程序。因为我需要登录才能测试任何应用程序功能,因此我首先访问
/
,然后重定向到登录表单并填写凭据。之后,我可以访问任何其他页面或导航应用程序。当我在示例中执行此操作时,一切正常:
it 'shows users' do
visit('/')
fill_in('user_username', with: 'test')
fill_in('user_password', with: 'testing123')
click_on('Sign In')
visit('/users')
expect(page).to have_text('Users')
end
但是,实际上我需要登录每个示例,因此我将代码移至 before 挂钩。
before :each do
visit('/')
fill_in('user_username', with: 'test')
fill_in('user_password', with: 'testing123')
click_on('Sign In')
end
it 'shows users' do
visit('/users')
expect(page).to have_text('Users')
end
令人惊讶的是,这一次不起作用。登录是在单独的浏览器窗口中完成的,最终我打开了两个窗口。一个验证了另一个未验证。
我将该行为分解为一个简单的
visit('/')
,它应该记住会话中的一个字符串。我创建了一个新的 Ruby on Rails 应用程序,并进行了以下更改:
应用程序/控制器/application_controller.rb
class ApplicationController < ActionController::Base
after_action only: :index do
session['memory'] = 'MEMORY'
end
def index
render plain: session['memory'] || 'First try!'
end
end
require 'rails_helper'
RSpec.describe "Systems", type: :system do
before do
visit('/')
end
it 'visits /' do
visit('/')
# halt to see two browser windows open at once
# debugger
expect(page).to have_text('MEMORY')
end
end
尽管除了安装之外我没有更改任何其他内容
rspec-rails
我仍然得到所描述的行为。在这种情况下,将打开两个浏览器窗口,均显示 First try!
。我希望测试能够发挥作用。难道我错了?
您可以在此处找到(未)运行的演示应用程序。
明白了。我不知道在哪里可以找到这些知识,我当然在水豚文档中没有看到它,但我解决了它:
config.before(:each, type: :system) do
driven_by(:selenium_chrome)
end
config.after(:each, type: :system) do
Capybara.reset_sessions!
end
这似乎将一个示例绑定到单个浏览器窗口。