编写系统测试时如何登录 before hook?

问题描述 投票:0回答:1

我有一个带有 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

规范/系统/systems_spec.rb

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!
。我希望测试能够发挥作用。难道我错了?

您可以在此处找到(未)运行的演示应用程序。

selenium-webdriver rspec capybara rspec-rails
1个回答
0
投票

明白了。我不知道在哪里可以找到这些知识,我当然在水豚文档中没有看到它,但我解决了它:

  config.before(:each, type: :system) do
    driven_by(:selenium_chrome)
  end

  config.after(:each, type: :system) do
    Capybara.reset_sessions!
  end

这似乎将一个示例绑定到单个浏览器窗口。

© www.soinside.com 2019 - 2024. All rights reserved.