4

私のコントローラーのいくつかには、対応するルートを持たないアクションがあります。これはrender ... and return、他のコントローラーアクションの a を介してのみアクセスされるためです。

たとえば、私はアクションを持っています

def no_such_page
 # displays a generic error screen
end

RSpec コントローラー テストで、そのメソッドを「取得」して応答本文を確認するにはどうすればよいですか?

私が試してみると:

  get :no_such_page
  response.status.should be(200)

もちろん、エラーが発生します

No route matches {:controller=>"foo", :action=>"{:action=>:no_such_page}"}
4

2 に答える 2

2

アップデート

あなたの質問を振り返ってみると、あなたは を介し​​てのみこのアクションにアクセスしているが、アクションではなくビューをレンダリングしていると言っているので、今では意味がありませrender ... and returnrender。このアクションが必要だと確信していますか? ビュースペックがこのテストの場所だと思います。

元の答え

HTTP リクエスト経由で呼び出されることのないアクションのレスポンス コードをテストしても意味がありません。同様にget :no_such_page、アクションを「取得」できないため意味がありません (アクションへのルートはありません)。メソッドを呼び出すことしかできません。

その意味で、それをテストする最良の方法は、クラスの他のメソッドと同じように扱うことです。この場合、クラスはコントローラーPostsControllerです。したがって、次のようなことができます。

describe PostsController do

  ... other actions ...

  describe "no_such_page" do
    it "displays a generic error screen" do
      p = PostsController.new
      p.should_receive(:some_method).with(...)
      p.no_such_page
    end
  end

end

しかし実際には、あなたが書いたことから判断すると、あなたのアクションには何も含まれていないように思えます。対応するビューによって生成された HTML 出力をテストしているだけです。その場合は、コントローラー仕様でこれをテストするべきではありません。応答本文の内容をテストするのにより適したビュー仕様を使用してテストするだけです。

于 2012-11-29T00:54:38.403 に答える
0
before :all do
  Rails.application.routes.draw do
    get '/no_such_page', to: "foo#no_such_page"
  end
end

after :all do
 Rails.application.reload_routes!
end
于 2015-01-09T19:01:27.250 に答える