2014-09-27 14 views
9

Michael Hartl'ın Ruby on Rails Tutorial bölümünü takip ediyorum. Rspec/capybara kullandığımda, fill_in yöntemi beni şaşırtıyor.fill_in Rspec/Capybara'da nasıl çalışır?

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

Bu benim test kodu edilir:

fill_in "Name", with: "Example User" 

O etiket gibi görünüyor ve text_field hem giriş alanını bulmak için FILL_IN için gerekli olan aşağıdaki görünüm kodu var. f.label'u çıkar veya <%= f.text_field :name %>'u <%= f.text_field :another_name %> olarak değiştirirseniz, sınama ElementNotFound hatasını verir. Burada fill_in'in nasıl çalıştığını herkes anlatabilir mi? Giriş alanı ve etiketin ikisi de fill_in yöntemi için gerekli midir?

cevap

14

fill_in alanı name, id veya etiket metni için stated biçimindedir. raylar kılavuzları ActionView::Helpers::FormHelper bölümüne göre, yaklaşık sormak görünüm kodu aşağıdaki html koduna çevrilmesi gerektiğini: Gördüğünüz gibi, label sen iç istemek "Ad" metin, üretilen

# 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" /> 

senin fill_in ifade. Ama input alanın id ve name özellikleri biraz farklıdır, bu yüzden aynı sonucu elde etmek id bazlı seçici kullanılarak olmalıydı:

fill_in "user_name", with: 'Example User' Yani

Özetlemek gerekirse, label alan gerekli değildir, ancak html kodunuzu dikkatlice izlemeli ve fill_in ifadesi için uygun parametreleri seçmelisiniz.

+0

anlamına mı geliyor? –

+0

@JoeyHu, gerçekten değil. Cevabımdaki 'html' snippet'ine bir göz atın - etiketin' for' özniteliği, girdinin 'id' ile aynı değere sahip olduğundan, sayfada gerçek konumdan bağımsız olarak birbirine bağlanırlar. – twonegatives

3

Sadece hangi twonegative'lerin yayınlandığını eklemek için.

alan adının [öznitelik], kimliği [nitelik,] veya etiket metni

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

yoluyla bulunabilir: Burada Kapibara dokümanlar FILL_IN() yöntemi için böyle der Ben 'Ad' etiketi silmek, ben herhangi birini kullanabilirsiniz takibi ve testler hala pass:

nil
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 

bazı karakterler olarak kullanılamaz bütün sembol belirtilmedikçe ymbol adı.

Capybara, tüm metin alanlarını (veya metin alanlarını) sayfadan almalı, daha sonra, id ve name özniteliklerinin değerlerini (Nokogiri gibi bir şeyle kolayca yapılabilir) aldıktan sonra, her iki değerin de ilk argümana eşit olup olmadığını kontrol etmelidir. fill_in() öğesine (ilk argümanı to_s()) bir String'e dönüştürdükten sonra.

3

2 sent'imi burada sağladım: Capybara not finding form elements.

Rails text_field yardımcısını alt çizgi (: first_name) ile çağırırsanız DOM, "First name" ve Capybara'nın gereksinim duyduğu şeyi alır. Id niteliğine gerek yok.

Görünüm: <%= form.text_field :first_name %>

Testi: Birazdan etiketten sonra, FILL_IN yöntemi olacak girdi doldurmak olduğunu ifade etiket adını kullanırsanız fill_in "First name", with: 'Elaine'