4

アセット パイプラインをオンにして Rails 3.2 を使用しています。まだ作成していないアクションをテストしています (TDD; 最初にテストを失敗させようとしています)。最初にテストを実行すると、期待どおりに失敗します。

class AccountsControllerTest < ActionController::TestCase

  def test_my_path
    get :my_path
    puts @response.body
    assert_template :my_path
  end

end

#=> test_my_path(AccountsControllerTest): AbstractController::ActionNotFound: The action 'my_path' could not be found for AccountsController

対応するビュー (app/views/my_path.html.erb) を追加すると、このアクションのルートを指定していないため、テストが失敗することが予想されます。それはパスしますが、ページがアセット パイプラインによってレンダリングされているためだと思います。私が呼び出すビューで、それは呼び出しから<%= request.fullpath %>吐き出されます。/assets?action=my_pathputs @response.body

ブラウザーで accounts/my_path にアクセスしようとすると、「[GET] "/accounts/my_path" に一致するルートがありません」と表示されるので、失敗しているテストがあることを確認したいと思います。なぜこのようなことが起こるのでしょうか? また、テストをどのように修正すればよいでしょうか? 代わりに、assert_recognizes を使用してルートを個別にテストする必要がありますか? 問題の原因を絞り込むために、ルート ファイルは現在空です。

4

1 に答える 1

1

まず、対応するアクションが定義されていなくても、Rails コントローラーは既存のテンプレートをレンダリングします ( http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-by-default-convention-over-configuration-in-action )。これが、テンプレートを追加した後にテストが成功した理由です。

機能テストはコントローラー アクションを直接呼び出し、ルーターを経由しません。そのため、ルートが定義されていなくてもテストに合格し、ブラウザーでは機能しません。ルート テスト (または統合テストのテスト ルート) には個別のテスト ケースを使用します。

于 2012-08-06T15:02:48.107 に答える