我有一个配置了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
,所以如果我能让它工作的话,我真的想以第一种方式去做。
提前致谢。
答案 0 :(得分:2)
before(:all)
运行块一次。这不适用于普通的Capybara设置,因为Capybara会在每次测试后重置会话,其中包括visit 'about:blank'
。如果您希望每个expect
保留一个it
,那么您的首次访问需要在before(:each)
块中。
话虽如此,在测试页面行为(访问页面,填写字段,单击按钮等)的功能测试中,每次测试坚持一个期望并没有多大意义,并且给定的测试正在进行期待多件事情发生。您的测试看起来它们真的属于视图测试,而不是功能测试。
此外,您应该使用have_title
匹配器,而不是将eq
与page.title一起使用