1

私はレールとrspecが初めてです。コントローラーにアクションではないカスタム メソッドがあります。仕様を使用してこのメ​​ソッドをテストしようとしています。

これが私のコントローラーメソッドです:

def find_target_by_id(target_id)    
    begin
      @target = Target.find(target_id)
    rescue ActiveRecord::RecordNotFound
      flash[:error] = "Target with Id #{target_id} does not exist."
      redirect_to root_url
    end
end

このメソッドの rspec テストは次のとおりです。

context "is given invalid id" do
   before do
     Target.stub(:find).with("1").and_raise(ActiveRecord::RecordNotFound)
   end
   it "returns flash[:error] " do
     TargetsController.new.find_target_by_id("1")
     flash[:error].should eq("Target with Id 1 does not exist.")
   end

   it "redirects to root url " do
      TargetsController.new.find_target_by_id("1")
      response.should redirect_to(root_url)
   end
end

ただし、テストを実行すると、次のエラーが表示されます。

Failure/Error: TargetsController.new.find_target_by_id("1").should have(flash[:error])
 RuntimeError:
   ActionController::Base#flash delegated to request.flash, but request is nil: #<TargetsController:0x007fced708ae50 @_routes=nil, @_action_has_layout=true, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_request=nil, @_response=nil>
 # ./app/controllers/targets_controller.rb:71:in `find_target_by_id'
 # ./spec/controllers/targets_controller_spec.rb:212:in `block (4 levels) in <top (required)>'

どんな助けでも大歓迎です。

4

1 に答える 1

1

実際の Web リクエストが行われない限り、Rspec でフラッシュにアクセスすることはできません。それがエラーが示唆していることです-それは見てrequest.flashrequestますが、Webリクエストを行っていないため、nilです。

いくつかのアイデア:

  • 実際にフラッシュにアクセスできるように、このメソッドを呼び出すアクションに対してテストで GET (または POST など) リクエストを作成します。
  • ヘルパー メソッドでフラッシュを設定しないでください。代わりに、エラー メッセージを返すか、例外を発生させて、フラッシュ メッセージの設定をコントローラー アクションに任せます。

私がこのような状況にあった場合、私は 2 番目のアプローチをとります。コントローラの操作 (フラッシュなどの設定など) はコントローラのアクションに任せ、ヘルパー メソッドを単純明快に保ちます。テストをよりシンプルに保つのに間違いなく役立ちます。

于 2012-12-20T16:43:23.133 に答える