2012-04-15 57 views
2

我已經完成了Ruby on Rails教程的第9章,並添加了我自己的功能來在用戶首次註冊時鎖定用戶,以便管理員擁有在新用戶訪問該網站之前進入並批准(「解鎖」)他們的ID。我添加了一個:鎖定的布爾屬性,它的作用就像User對象的:admin屬性一樣。我現在都在工作,但是我很難爲它寫一個簡單的測試。我增加了以下測試user_pages_spec.rb,剛下層次結構「分頁」 - 「作爲管理員用戶」:我爲Rails編寫的新用戶鎖定函數測試教程應用

describe "as an admin user to unlock new users" do 
    let(:admin) { FactoryGirl.create(:admin) } 
    let(:locked_user) { FactoryGirl.create(:locked) } 
    before do 
     sign_in admin 
     visit users_path 
    end 

    it { should have_link('unlock', href: user_path(locked_user)) } 
    it { should_not have_link('unlock', href: user_path(admin)) } 
end 

,並支持「鎖定」用戶的創建,加入這factories.rb :

factory :locked do 
    locked true 
end 

我可以手動確認通過火狐的解鎖鏈接顯示出來,但我仍然得到以下故障:

1) User pages index pagination as an admin user to unlock new users 
    Failure/Error: it { should have_link('unlock', href: user_path(locked_user)) } 
     expected link "unlock" to return something 
    # ./spec/requests/user_pages_spec.rb:64:in `block (5 levels) in <top (required)>' 

我想知道一)爲什麼失敗: ),b還有b)如何去調試這樣的問題。我如何說出測試實際上是「看到」的?我嘗試了另一個stackoverflow用戶提出的另一個問題,但在這種情況下,我發現它的使用受到限制。

任何意見或建議,將不勝感激。提前致謝!

-Matt

回答

0

你應該先寫測試;)

使用您的測試作爲一個開始,我一直在經歷的過程。我已經到了和你一樣得到同樣的錯誤的地步。使用撬滑軌的寶石,並把binding.pry測試:

it { binding.pry ; should have_link('unlock', href: user_path(locked_user)) } 

我複製並粘貼從測試到命令提示符(周圍有很多搞亂後):

should have_link('unlock', href: user_path(locked_user)) 

,並得到錯誤。將其更改爲:

​​

的作品。在提示符下輸入locked_user將顯示用戶記錄。接下來我進入page.body,它顯示我的鎖定用戶甚至不會顯示在頁面上。 (通過輸入User.count進行確認,發現它是33,因此它在第2頁上。)根據嵌入式測試的規格有多深,您可能沒有這個問題。我意識到我意外地將它嵌入了另一個規範中。當我將它移出(User.count == 2)時,它仍然不起作用。我的locked_user仍然不在頁面上。 User.all也不包括用戶。 Hartl在第10章中提到,

這使用let! (閱讀「let bang」)方法代替let;原因是讓變量是懶惰的,這意味着它們只有在被引用時纔會出現。

改變讓讓!它的工作。 (用戶。count == 3,包括locked_user這次)。這裏是測試塊。我的代碼還沒有解鎖任何東西(我需要另一個測試...),但鏈接顯示時,它應該。 :)

+0

嗨,Eric,再次感謝您的幫助!我在上面嘗試了你的修改過的測試,在user_pages_spec.rb文件的各個部分,沒有運氣。即使在設置了binding.pry斷點然後檢查page.body之後,我可以看到「解鎖」鏈接在頁面上,而locked_user正確。我不知道我是否以測試框架能夠理解的方式創建鏈接。這裏是_user.html.erb的相關部分: '<%if current_user.admin? && user.locked? &&!current_user?(user)%> | <%= link_to「解鎖」,unlock_user_path(用戶),方法:: get,確認:「啓用新用戶?」 %> <% end %>' – newton10471 2012-04-16 18:40:13

+0

嘗試在斷點處使用unlock_user_path(user)以確保它符合您的期望。 – EricM 2012-04-17 22:35:58

+0

結果如下:'[1] pry(#)> unlock_user_path(user) =>「/ users/826/unlock「 [2] pry(#)>'。我還發現並嘗試了Capybara的'save_and_open_page'方法,該方法打開了一個網頁瀏覽器,在相關的地方出現問題的頁面,並顯示了我期望的頁面。我正在考慮從user_pages_spec.rb文件中彈出此測試,並將其放入它自己的測試文件中,以將其與可能會干擾的其他任何內容隔離開來。 – newton10471 2012-04-18 21:18:05

0
it { should have_link('unlock', href: user_path(locked_user)) } 

乍一看,你需要使用類似response.body.should have...page.should.have...

也可能需要render_views

0

你可能想:

let!(:locked_user) { FactoryGirl.create(:locked) } 

請注意,我用let!()而不是let()。有關let()let!()的更多信息,請參見rspec docs,以及它在這裏的重要性。

相關問題