2015-06-22 58 views
0

我想將單元測試添加到處理顯示錯誤的項目的一部分中。將ActiveRecord :: Errors對象設置爲零

爲了在沒有ActiveRecord :: Errors對象迭代的情況下測試正確的處理,我試圖從其他工作的測試夾具中刪除錯誤對象(而不是單個錯誤)(@customer )。

我本來希望@customer.errors = nil會做這項工作,但它會引發一個錯誤。

測試用例:

test "Errors_WhenErrorsObjectNotFound_RaisesNoErrors" do 
    log_in_as(@customer) 
    @customer.errors = nil 
    get :edit, id: @customer 
    assert_nothing_raised 
    end 

單位被測試(應該是不相關的,但以防萬一):產生

<% if errors.count == 0 || errors.nil? %> 
    <div class="success"> 
   <ul> 
     <li>Update successful</li> 
    </ul> 
    </div> 
<% else %> 
    <div class="error"> 
   <ul> 
     <% errors.full_messages.each do |err| %> 
     <li><%= err %></li> 
     <% end %> 
    </ul> 
    </div> 
<% end %> 

錯誤:

3) Error: 
CustomersControllerTest#test_Errors_WhenErrorsObjectNotFound_RaisesNoErrors: 
NoMethodError: undefined method `errors=' for #<Customer:0x9b0f958> 
    test/controllers/customers_controller_test.rb:184:in `block in <class:CustomersControllerTest>' 

任何建議,就如何刪除錯誤對象?

回答

0

您正在尋找ActiveModel::Errors#clear.

test "Errors_WhenErrorsObjectNotFound_RaisesNoErrors" do 
    log_in_as(@customer) 
    @customer.errors.clear 
    get :edit, id: @customer 
    assert_nothing_raised 
end 
+0

謝謝,但是這似乎是我想的正好相反 - 這將刪除錯誤的錯誤消息的對象,而不是刪除錯誤對象本身。我的目標是使「錯誤」本身爲零,以確保正確處理這種情況。 – Zild

+0

你確定有'錯誤'爲零的情況嗎?根據我的經驗,在處理ActiveRecord :: Base類時,它總是空白('{}')或非空白('{'foo'=> ['bar']}')。 – messanjah

+0

可能不是。但是,我試圖通過單元測試來應用單元測試的最佳實踐,而不對輸入做出任何假設。事實上,我們過去確實遇到過問題,因爲這個單元有時會與非ActiveRecord對象一起使用(儘管後來被用來實現ActiveRecord :: Errors),所以如果在將來會出現其他類似的情況時使它具有錯誤證明功能某種意義上,我想。 – Zild

相關問題