RSpec只有第一个'it`块传递,而Capybara或Selenium重定向页面

时间:2016-08-31 20:22:22

标签: ruby selenium rspec capybara

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

$scope.$watch(function() {
        return langFctr.selectedLang;
    },
    function(newValue, oldValue) {
        if (oldValue != newValue) {
            $scope.selectedLang = newValue;
            if (newValue) {
                $('#calendar').fullCalendar('option', 'lang', $scope.selectedLang);
            }
            console.log($('#calendar').fullCalendar('option', 'lang', $scope.selectedLang));
            console.log($scope.selectedLang);
        }
    }
);

页面导航到第一个<div class="col-xs-12 select-checkbox" > <label style="width: 18em;" ng-model="vm.settingsObj.MarketPeers"> <input name="radioClick" type="radio" ng-click="vm.setPeerGrp('market');" ng-value="vm.settingsObj.MarketPeers" style="position:absolute;margin-left: 9px;"> <div style="margin-left: 35px;color: #717171e8;border-bottom: 0.5px solid #e2e2e2;padding-bottom: 2%;">Hello World</div> </label> </div> 次传递,然后页面重定向到空白页面,最后三个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

以下是 Gemfile 的内容:

it

这是我的 spec_helper.rb

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 ,所以如果我能让它工作的话,我真的想以第一种方式去做。

提前致谢。

1 个答案:

答案 0 :(得分:2)

在评估'it'块之前,

before(:all)运行块一次。这不适用于普通的Capybara设置,因为Capybara会在每次测试后重置会话,其中包括visit 'about:blank'。如果您希望每个expect保留一个it,那么您的首次访问需要在before(:each)块中。

话虽如此,在测试页面行为(访问页面,填写字段,单击按钮等)的功能测试中,每次测试坚持一个期望并没有多大意义,并且给定的测试正在进行期待多件事情发生。您的测试看起来它们真的属于视图测试,而不是功能测试。

此外,您应该使用have_title匹配器,而不是将eq与page.title一起使用