2016-10-05 28 views
0

任何人都可以解釋這個錯誤嗎?Ruby/RSpec/WebDriver錯誤>對'has_content?'的預期響應

我的spec_helper.rb要求capybara,rspecselenium-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

發生這種情況的原因是@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(注更合適:段以下是未經測試,並letsubject之間的差異被覆蓋在其他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 
+0

我在這裏看到的概念。在你的例子中,這是有道理的,因爲你將有限的整數傳遞給變量,然後對該變量進行期望。然而,我有點困惑,我怎麼可以將一個頁面的全部內容(我正在檢查單詞'Search')的內容傳遞給一個變量,然後我將理論上檢查該字符串。 – priorww1

+1

您可以將任何對象傳遞給'let',它不一定是文字。 – zetetic

相關問題