Ruby RSpec仅第一个'it'块通过,而Capybara或Selenium重定向页面

Ruby RSpec仅第一个'it'块通过,而Capybara或Selenium重定向页面,ruby,selenium,rspec,capybara,Ruby,Selenium,Rspec,Capybara,我有一个相当简单的测试场景,配置了RSpec、Capybara和Selenium: require './spec_helper' RSpec.describe 'test' do title = 'My title' context 'When I navigate to my page' do before(:all) do visit 'http://foo.com/' end it "the page title is #{title}"

我有一个相当简单的测试场景,配置了RSpec、Capybara和Selenium:

require './spec_helper'

RSpec.describe 'test' do
  title = 'My title'

  context 'When I navigate to my page' do
    before(:all) do
      visit 'http://foo.com/'
    end

    it "the page title is #{title}" do
      expect(page.title).to eq(title)
    end

    it 'there is an input for email' do
      expect(page).to have_css('#login-u')
    end

    it 'there is an input for password' do
      expect(page).to have_css('#login-p')
    end

    it 'there is an input for access token' do
      expect(page).to have_css('#login-a')
    end
  end
end
页面被导航到,第一个
it
通过,然后页面重定向到空白页面,最后三个
it
块失败

有趣的是,如果我将每个
expect
语句移动到第一个
it
块中,则测试通过:

require './spec_helper'

RSpec.describe 'test' do
  title = 'My title'

  context 'When I navigate to my page' do
    before(:all) do
      visit 'http://foo.com/'
    end

    it "the page title is #{title}" do
      expect(page.title).to eq(title)
      expect(page).to have_css('#login-u')
      expect(page).to have_css('#login-p')
      expect(page).to have_css('#login-a')
    end
  end
end
以下是我的文件的内容:

source "https://rubygems.org"

gem 'rspec', '~> 3.0'
gem 'selenium-webdriver'
gem 'capybara'
require 'rubygems'
require 'bundler/setup'
require 'rspec'
require 'selenium-webdriver'
require 'capybara/rspec'

Capybara.default_driver = :selenium

RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

  config.shared_context_metadata_behavior = :apply_to_host_groups

  config.include Capybara::DSL
end
这是我的规范帮助程序。rb

source "https://rubygems.org"

gem 'rspec', '~> 3.0'
gem 'selenium-webdriver'
gem 'capybara'
require 'rubygems'
require 'bundler/setup'
require 'rspec'
require 'selenium-webdriver'
require 'capybara/rspec'

Capybara.default_driver = :selenium

RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

  config.shared_context_metadata_behavior = :apply_to_host_groups

  config.include Capybara::DSL
end
有人有什么建议吗?据我所知,最好的做法是每个
it
都有一个
expect
,所以如果我能让它工作,我真的很想用第一种方法来做

提前感谢。

before(:all)
在评估“it”块之前运行该块一次。这不适用于正常的Capybara设置,因为Capybara会在每次测试后重置会话,其中包括
visit'about:blank'
。如果您想为每个
it
保留一个
expect
,那么您的首次就诊需要在(:each)之前的
块中

也就是说,在特性测试中,坚持每个测试一个期望值没有多大意义,您应该测试页面行为(访问页面、填写字段、单击按钮等),并且给定的测试将期望发生多个事件。您的测试看起来它们实际上属于视图测试,而不是特性测试

此外,您应该使用
have_title
匹配器,而不是对页面使用
eq
。这不适用于正常的Capybara设置,因为Capybara会在每次测试后重置会话,其中包括
visit'about:blank'
。如果您想为每个
it
保留一个
expect
,那么您的首次就诊需要在(:each)
之前的
块中

也就是说,在特性测试中,坚持每个测试一个期望值没有多大意义,您应该测试页面行为(访问页面、填写字段、单击按钮等),并且给定的测试将期望发生多个事件。您的测试看起来它们实际上属于视图测试,而不是特性测试


此外,您应该使用
have_title
matcher,而不是对页面使用
eq
。title

您是否尝试将before块移到上下文块之外?在钩子本质上是上下文的之前,这是一个好主意,但它不起作用。我将
before
块移出
上下文,第一个
it
通过,但其他三个
it
s失败:(又玩了一遍。我把
before
上下文中移出
并将其从
before(:all)
更改为
before(:each)
。这很有效,但现在它会分别四次重新访问页面。我知道
before(:each)
是如何工作的,但它看起来像
before(:all)
也应该可以。您是否尝试过将before块移到上下文块之外?before hook本质上是上下文的好主意,但没有起作用。我将
before
块移出
上下文,第一个
它通过了,但其他三个
它失败了:(又玩了一遍。我把
before
上下文中移出
并将其从
before(:all)
更改为
before(:each)
。这很有效,但现在它会分别四次重新访问页面。我知道
before(:each)
是如何工作的,但它看起来像
before(:all)
也可以。谢谢你的解释。视图测试和功能测试是什么意思?我从来没有听说过视图测试。不管它值多少钱,这可能是我将进行的最简单的测试。其他人将登录并与页面进行更多交互。@vulpix RSpec支持多种类型的测试-其中之一是视图规范--用于测试应呈现到页面的内容。Capybara将其匹配器包含在视图规范中,以便您可以执行
expect(rendered)之类的操作。使用css(“#login”)
。只测试登录框的功能测试没有多大意义,因为您应该有一个填充该框的功能测试,如果该框丢失,则在尝试填充时会出错。@vulpix如果这为您回答了问题,请不要忘记接受它(复选标记)所以这个问题被标记为已回答。关于视图测试的部分对我来说没有意义,所以在我接受你的答案之前,我一直在等你解释。谢谢你的解释。谢谢你的解释。视图测试和功能测试是什么意思?我从来没有听说过视图测试。不管它值多少钱,这都是专业的bably我将让其他人进行的最简单的测试将更多地登录并与页面交互。@vulpix RSpec支持多种类型的测试——其中一种是视图规范——用于测试应该呈现到页面上的内容。Capybara将其匹配器包含到视图规范中,以便您可以执行
expect(rendered)之类的操作
。只测试登录框的功能测试没有多大意义,因为您应该有一个填充该框的功能测试,如果该框丢失,则在尝试填充时会出错。@vulpix如果这为您回答了问题,请不要忘记接受它(复选标记)所以这个问题被标记为已回答。关于视图测试的部分对我来说没有意义,所以在我接受你的答案之前,我一直在等待你的解释。谢谢你的解释。