2012-08-23 15 views
0

我想爲非RESTful路由編寫Rails功能測試。如何在Rails中測試任意路線?

我正在使用Test :: Unit。

routes.rb我有這條路線...

match '/contract_search' => 'contracts#contract_search', \ 
    :as => 'contract_search', \ 
    :via => :post 

而在我的合同控制器我有這個動作......

def contract_search 
    # ... 
end 

contracts_controller_test.rb我想...

test 'POST to contracts with search params.' do 
    post(:contract_search, { 
    :contract_search => { 
     :title_like => 'System' 
    } 
    }, unprivileged_internal_user_session_vars, { }) 

    assert(
    assigns(:contracts).length == 6, 
    "@contracts.length #{assigns(:contracts).length} is incorrect." 
) 

end 

該操作在瀏覽器中按預期工作。

但試驗剛出來的錯誤與...

1) Error: 
test_POST_to_contracts_with_search_params.(ContractsControllerTest): 
NoMethodError: undefined method `length' for nil:NilClass 
    test/functional/contracts_controller_test.rb:49:in `block in <class:ContractsControllerTest>' 

我的感覺是,測試::單位正試圖張貼到/contracts/contract_search,我想。

這樣做的正確方法是什麼?

回答

2

由於在您的測試代碼中,您使用的是assigns(:contracts),您必須確保您的控制器方法正確地填充@contracts變量。

可能是您錯過了運行測試用例的一些先決條件。

0

問題不在於路由,而在於斷言中的assigns(:contracts)assigns(:contracts)爲零,因此當您撥打length時,它會返回NoMethodError

答案必須在您的contract_search操作中,您可以發佈代碼嗎?