2016-03-29 12 views
6

ビルドしていないアプリケーションのコントローラテストを書いていますので、間違いなく学習プロセスでした。これは、AbstractController :: Baseから直接継承するコントローラに初めて遭遇したときです。明らかに、他のコントローラと同じように動作しません。Rspecコントローラは、AbstractController :: Baseを継承するコントローラをRailsでテストします。

そのフォーマットはおおよそ次のとおりです。

class SchwadGenericController < AbstractController::Base 
    def schwad_method var_one, var_two = nil, var_three = nil 

    if var_two.blank? 
     var_one.generic_method 
    end 

    render template: "schwad_templates/generic_template", layout: false 
    end 
end 

私は私が起こることをANYTHINGを取得する時に、現在午前ところ、これは、通常のテストを試してみました。

require 'rails_helper' 

describe SchwadGenericController do 
    # before(:each) do 
    #  SchwadGenericController.skip_authorize_resource 
    # end 
    # login_user 
    let!(:variable){ create(:my_factory_variable) } 


    describe 'controller methods' do 

    it 'should hit this method' do 
     binding.pry 
     SchwadGenericController.schwad_method(variable) 
     # expect(response).to_render template: "schwad_templates/generic_template" 
    end 
    end 
end 

ここでは、おおよその失敗が上陸しています。

Failures: 

    1) SchwadGenericController controller methods should hit this method 
     Failure/Error: Unable to find matching line from backtrace 
    NoMethodError: 
     undefined method `request=' for # <SchwadGenericController:0x007f8022db0a20> 

私は抽象コントローラと、ここレールにおけるその役割をよく読んで:https://www.mobomo.com/2012/06/and-you-thought-render-farms-were-just-for-pixar/

私はここにドキュメントをよく読んで:http://api.rubyonrails.org/classes/AbstractController/Base.html

私は本当に別の本に目のセットと指導をお願い申し上げますAbstractController :: Baseから継承しているコントローラを使って、コントローラとそのメソッドをどのようにテストしたかについては、どうしたらいいですか? AbstractControllerから直接拡張

-Schwad

答えて

2

いくつかのテストの後、私はこれが可能ではないと思います。コントローラの仕様は、ActionController::Baseから継承したテストクラスであるwrappers for Rails functional testsです。コントローラテストも実行するため、コントローラはAbstractController::Baseの場合は(これらはActionController::Basedefinedている)されていない、requestresponseオブジェクトをサポートしなければなりません。そのため、テストを実行すると特定のエラーが発生します。再び、これらはコントローラの仕様のためにのみ定義し、あなたのコントローラクラスは、「コントローラの仕様」の「コントローラ」ではありませんが、ため、同じ理由で、あなたはコントローラの仕様ヘルパーを使用することはできません意味をなどto_renderを(期待します) 。

あなたがテスト用に持っているように思われる唯一のオプションは、他の普通のルビークラスと同様にコントローラをテストすることです。テストをspec/controllersディレクトリから他のディレクトリに移動する必要があります。 spec/abstract_controllersその後、あなたは例えば、単にインスタンスメソッドを呼び出して、すべてのコントローラの仕様ヘルパーやテストを放棄する必要があると思います:意図したとおりに

describe 'controller methods' do 
    it 'should hit this method' do 
    c = SchwadGenericController.new 
    expect(c).to receive(:render).with(template: "schwad_templates/generic_template", layout: false) 
    c.schwad_method(variable) 
    end 
end 
+0

ありがとうございます。この方法で実行して報告します。 – Schwad

1

:: Baseが私には、エラーの可能性が高いソースです。非常に非凡なことをしていない限り、これを行う理由はないはずです。

ActionController :: Baseから継承するつもりはありませんか? ActionControllerには、レンダリングに必要なモジュールがたくさんあります。おそらく、テストで欠落しているメソッドのエラーを説明しています。

ActionController :: Baseへの切り替えが機能しない場合。レールコンソールからapp.get "/path/to/action"を実行してみてください。同じエラーが出ますか?

+0

これはうまくすることができ、クラスは動作しますが、私は読んでテストを書くに取り組んでいます単なるアプローチでは、必要に応じてコードとテストをリファクタリングすることができます。 – Schwad

関連する問題