2014-09-27 49 views
9

我正在關注Michael Hartl的Ruby on Rails教程。當我使用rspec/capybara時,fill_in方法讓我感到困惑。我有以下看法代碼:fills在Rspec/Capybara中如何工作?

<%= f.label :name %> 
<%= f.text_field :name %> 

這是我的測試代碼:

fill_in "Name", with: "Example User" 

看來,標籤都需要FILL_IN查找輸入字段text_field。如果我要麼f.label或更改<%= f.text_field :name %><%= f.text_field :another_name %>,測試會給我ElementNotFound錯誤。任何人都可以解釋fill_in在這裏的工作原理嗎?輸入字段和標籤都需要fill_in方法嗎?

回答

14

它是statedfill_in查找字段name,id或標籤文本。據軌道導遊ActionView::Helpers::FormHelper部分,你問的視圖代碼應轉換爲下面的HTML代碼:

# I assume that you made a form for a @user object 
<label for="user_name"> 
    Name 
</label> 
<input id="user_name" name="user[name]" type="text" /> 

正如你看到的,label生產的「名稱」文本,你問的裏面你fill_in表達式。但是inputidname性質略有不同,所以你應該一直使用id根據選擇來達到相同的結果:

fill_in "user_name", with: 'Example User'

所以,綜上所述,不需要label場,但你應仔細注意您的html代碼並選擇fill_in表達式的適當參數。

+0

這是否意味着,如果我在表達式中使用的標籤名,FILL_IN方法會在輸入填充後的標籤嗎? – 2014-09-27 21:24:23

+0

@JoeyHu好吧,不是。在我的回答中查看'html'片段 - 標籤的'for'屬性與輸入的'id'具有相同的值,因此無論頁面上的實際位置如何,它們都鏈接在一起。 – twonegatives 2014-09-29 05:49:36

3

只是添加到發佈的雙音節。下面介紹一下水豚文檔說的​​FILL_IN()方法:

場可以通過它的名字[屬性],ID [屬性]或標籤文本

http://rubydoc.info/github/jnicklas/capybara/Capybara/Node/Actions:fill_in

被發現當我刪除了「名稱」的標籤,我可以使用下列任一和測試仍然通過:

fill_in 'user_name', with: "Example User" #locate text field by id attribute 
fill_in :user_name, with: "Example User" #locate text field by id attribute 

fill_in 'user[name]', with: "Example User" #locate text field by name attribute 
fill_in :'user[name]' with: "Example User" #locate text field by name attribute 

在Ruby中,一些字符不能作爲使用ymbol名稱,除非整個符號被引用。

水豚必須從頁面中檢索所有文本字段(或文本區域),然後獲取id和name屬性的值(很容易用Nokogiri這樣的東西完成),然後檢查兩個值是否等於第一個參數fill_in()(通過to_s()將第一個參數轉換爲String後)。

3

我在這裏提供了我的2美分:Capybara not finding form elements

如果您使用下劃線(:first_name)調用Rails text_field helper,那麼DOM會呈現爲「First name」以及Capybara需要的東西。不需要一個id屬性。

查看: <%= form.text_field :first_name %>

測試: fill_in "First name", with: 'Elaine'