2013-04-27 73 views
0

Ruby,Rails和TDD的新手。我使用RSpec和Capybara和Capybara webkit。Ruby on Rails - RSpec Javascript測試與水豚(RoR新)

嘗試測試頁面上是否存在div元素。

Login module should have a module container with id mLogin 
    Failure/Error: page.evaluate_script('$("div#mLogin").attr("id")').should eq "mLogin" 

     expected: "mLogin" 
      got: nil 

冉JS瀏覽器開發工具,並獲得 「mLogin」,而不是零:

測試代碼:與

require 'spec_helper' 
describe "Login module" do 

    before do 
     visit root_path 
    end 

    it "should have a module container with id mLogin" do 
     page.should have_css('div#mLogin') 
    end 

    it "should have a module container with id mLogin", :js => true do 
     page.evaluate_script('$("div#mLogin").attr("id")').should eq "mLogin" 
    end 

end 

第一個測試通過,但第二次測試失敗。

任何想法?謝謝。

回答

0
find('div#mLogin')[:id].should eq 'mLogin' 

從文檔顯示方式:

#evaluate_script 
Evaluate the given JavaScript and return the result. Be careful when using this with scripts that return complex objects, such as jQuery statements. execute_script might be a better alternative. 

evaluate_script總是返回零,據我記得。

無論如何,你的第二個測試看起來像測試水豚是否有效,因爲你的第一次測試就足夠了。

+0

yeh我只是想看看我能否得到它的工作。這是我認爲的另一種方式,評估返回結果並執行不。這是奇怪,因爲: page.evaluate_script(「1 + 1」)應EQ 2級 的作品,但我的id來獲取腳本失敗 – 2013-04-27 11:10:02

+0

'execute_script'總是返回nil-'evaluate_script'返回評估腳本,爲您的文檔引用說... – 2014-01-02 21:37:07

0

一個可能的問題是have_css匹配器支持Capybara的同步功能。如果沒有立即找到選擇器,它將等待並重試,直到找到或超時。

有關於這個在http://rubydoc.info/github/jnicklas/capybara#Asynchronous_JavaScript__Ajax_and_friends_

在另一方面,立即evaluate_script運行更多的文檔。由於這是您訪問該頁面後首先執行的操作,因此存在爭用條件:可能會在頁面加載完成之前執行此腳本。

您可以嘗試在網頁上找到,直到頁面加載你叫evaluate_script之前不會出現一個元素修復這個問題。

或者,您可以打電話給synchronize以明確重試,但通常不建議這樣做。對於這樣的情況,使用Capybara的內置匹配器會更好。當沒有內置的方法來完成你需要做的事時,evaluate_script方法只能作爲最後的手段使用,並且你需要非常小心以避免競爭條件。