任何人都可以解释这个错误吗?
我的spec_helper.rb
需要capybara
,rspec
和selenium-webdriver
。
我的test_spec.rb
文件包含以下内容:
require_relative 'spec_helper'
@browser = Selenium::WebDriver.for :firefox
@browser.get "http://www.google.com"
describe 'ErrorCheck' do
it 'should log in to Trialnet' do
expect(@browser).to have_content('Search')
end
end
我的错误:
expected to respond to `has_content?`
./spec/webdriver3_spec.rb:9:in `block (2 levels) in <top (required)>'
-e:1:in `load'
-e:1:in `<main>'
知道为什么这种期望会失败吗?它是否在没有正确语法的情况下返回布尔值来接受它?
答案 0 :(得分:0)
这种情况正在发生,因为@browser
实例变量不适用于it
语句。请注意,您的错误消息没有引用它正在执行预期的对象(即expected to respond to 'has_content?'
。
这是一个人为的示威,表明它失败了:
require 'rspec'
@x = 1
describe 'One' do
it 'should print 1' do
expect(@x).to eq 1
end
end
Failures:
1) One should print 1
Failure/Error: expect(@x).to eq 1
expected: 1
got: nil
并且 - 通过将实例变量移动到it
语句中可用 - 示例传递:
require 'rspec'
describe 'One' do
it 'should print 1' do
@x = 1
expect(@x).to eq 1
end
end
1 example, 0 failures
并且 - 如果您使用let
- 您可以创建一个可以跨示例共享的memoized变量:
require 'rspec'
describe 'One' do
let(:x) { 1 }
it 'should print 1' do
expect(x).to eq 1
end
it 'should print 2' do
expect(x+1).to eq 2
end
end
根据您的示例代码,您可以使用before
块进行设置,然后使用subject
,这可能比let
更合适(注意:下面的代码段未经测试,并且let
和subject
之间的区别在其他SO答案,各种博客文章和rdoc中都有介绍:
describe 'ErrorCheck' do
before :all do
@browser = Selenium::WebDriver.for :firefox
@browser.get "http://www.google.com"
end
subject(:browser) {@browser} # or let(:browser) {@browser}
it 'should log in to Trialnet' do
expect(@browser).to have_content('Search')
end
end