0

RESTful でないルートの 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>'

私の感覚では、Test::Unit は に投稿しようとしている/contracts/contract_searchと思います。

これを行う正しい方法は何ですか?

4

2 に答える 2

2

テストコードでは を使用してassigns(:contracts)いるため、コントローラーメソッドが@contracts変数を適切に設定していることを確認する必要があります。

テスト ケースを実行するためのいくつかの前提条件が満たされていない可能性があります。

于 2012-08-23T04:23:51.343 に答える
0

問題はルーティングではなくassigns(:contracts)、アサーションにあります。assigns(:contracts)は nil なので、それを呼び出すlengthと が返されますNoMethodError

答えはあなたのcontract_search行動にあるはずです。コードを投稿できますか?

于 2012-08-23T02:59:14.953 に答える