2013-03-15 55 views
1

我覺得我在這裏瘋了。對我的Post模型進行常規水豚測試。具體來說,確保新頁面在有效提交後重定向到新創建的帖子。所以在我的spec/requests文件夾中,我有這個:Rails水豚看不到田地

describe "Valid post submission --" do 

    it "should log in a user and redirect to new post" do 

     # Sign in works find, so I won't reproduce it 

     # Make a blogpost 
     Post.destroy_all 
     fill_in :name_here, with: "Post Name Here" 
     fill_in :content_here, with: "This is the content of a really short post." 
     screenshot_and_open_image 
     click_on "Post It" 
     screenshot_and_open_image 
     puts current_path 
     page.should have_selector 'h2', text: "prohibited this post" 
     page.should have_selector 'h1', text: "Post Name Here" 
     page.should have_selector '.alert', text: "Post was successfully created." 
     page.should have_selector 'title', text: full_title('Post Name Here') 

    end 

屏幕截圖和放置是爲了闡明發生了什麼。基本上有兩種不同的情況。在

  1. 我只是離開字段是和測試的默認ID(「post_name」 和「post_content」);顯然上面的測試是針對案例二:
  2. 我將字段標識更改爲「name_here」和「content_here」以測試標籤名稱或其他任何內容是否有干擾。這就是上面的規格 。

在情況2中,由於水豚無法找到任何一個字段,因此該帖子被拒絕。

在情況1中,只有內容將是空的,但名稱字段將填充內容

精確的錯誤的情況下,1:

2) Posts Invalid post - should refresh with error if content empty 
    Screenshot: /Users/myusername/rails/appname/tmp/capybara/screenshot_2013-03-14-22-37-36.634.png 
    Failure/Error: fill_in :post_name, with: "Post Name Here" 
    Capybara::ElementNotFound: 
     cannot fill in, no text field, text area or password field with id, name, or label 'post_name' found 
    # (eval):2:in `fill_in' 
    # ./spec/requests/posts_spec.rb:43:in `block (3 levels) in <top (required)>' 

案例2不會引發錯誤關於沒有找到合適的內容,我相信,因爲標籤有ID爲好。

這很荒謬,因爲我在測試中的HTML durin的快照,就在它出錯之前。這裏的情況下2 - 這兩種情況下看90%的同樣在這裏,除了那個ID的區別:

<form accept-charset="UTF-8" action="/posts" class="new_post" id="new_post" method="post"> 
<div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"></div> 
<div class="field"> 
    <label for="post_name">Name</label> 
    <br><input id="name_here" name="post[name]" size="30" type="text"> 
</div> 
<div class="field text-area"> 
    <label for="post_content">Content</label> 
    <br><textarea cols="50" id="content_here" name="post[content]" rows="20"></textarea> 
</div> 
<div class="actions btn-group"> 
    <input class="btn" name="commit" type="submit" value="Post It"> 
</div> 
</form> 

注意POST_CONTENT領域的明確存在。如果兩者均失敗(情況1),則同時存在content_here和name_here字段。所以田地在那裏。水豚一般都在工作(這類工作可以在我的應用的其他部分找到)。問題與標籤名稱沒有衝突,因爲在輸入字段上添加不同的ID並不能幫助水豚找到它們。

順便說一句,這一切都在現實中完美運作。

任何想法在這裏發生了什麼?我非常沮喪/無知。

UPDATE - 繼user2172816的建議下,我改變了我的HAML所以HTML看起來像這樣:

<form accept-charset="UTF-8" action="/posts" class="new_post" id="new_post" method="post"> 
<div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"></div> 
<div class="field"> 
    <label for="post_name">Name</label> 
    <br><input id="name" name="post[name]" size="30" type="text"> 
</div> 
<div class="field text-area"> 
    <label for="post_content">Content</label> 
    <br><textarea cols="50" id="content" name="post[content]" rows="20"></textarea> 
</div> 
<div class="actions btn-group"> 
    <input class="btn" name="commit" type="submit" value="Post It"> 
</div> 
</form> 

測試現在看起來是這樣的:

# Make a blogpost 
    Post.destroy_all 
    fill_in "Name", with: "Post Name Here" 
    fill_in "Content", with: "This is the content of a really short post." 
    page.should have_selector 'h2', text: "prohibited this post" 
    page.should have_selector 'h1', text: "Post Name Here" 
    page.should have_selector '.alert', text: "Post was successfully created." 
    page.should have_selector 'title', text: full_title('Post Name Here') 

但它仍然示數( ):

1) Posts Invalid post - should refresh with error if content empty 
    Screenshot: /Users/username/rails/appname/tmp/capybara/screenshot_2013-03-14-23-54-38.072.png 
    Failure/Error: fill_in :name, with: "Post Name Here" 
    Capybara::ElementNotFound: 
     cannot fill in, no text field, text area or password field with id, name, or label 'name' found 
    # (eval):2:in `fill_in' 
    # ./spec/requests/posts_spec.rb:43:in `block (3 levels) in <top (required)>' 

    2) Posts Invalid post - should refresh with error if name empty 
    Screenshot: /Users/username/rails/appname/tmp/capybara/screenshot_2013-03-14-23-54-38.274.png 
    Failure/Error: fill_in :name, with: "" 
    Capybara::ElementNotFound: 
     cannot fill in, no text field, text area or password field with id, name, or label 'name' found 
    # (eval):2:in `fill_in' 
    # ./spec/requests/posts_spec.rb:33:in `block (3 levels) in <top (required)>' 

    3) Posts Valid post submission -- should log in a user and redirect to new post 
    Screenshot: /Users/username/rails/appname/tmp/capybara/screenshot_2013-03-14-23-54-38.459.png 
    Failure/Error: fill_in :name, with: "Post Name Here" 
    Capybara::ElementNotFound: 
     cannot fill in, no text field, text area or password field with id, name, or label 'name' found 
    # (eval):2:in `fill_in' 
    # ./spec/requests/posts_spec.rb:67:in `block (3 levels) in <top (required)>' 

回答

5

標籤的屬性「for」應該是輸入元素的「id」,即

<label for="name_here">Name</label> 
    <br><input id="name_here" name="post[name]" size="30" type="text"> 

而且在規範你應該叫:

fill_in 'Name', with: "Post Name Here"