2016-06-21 13 views
0

私は非常にRailsに慣れていて、RSpecで少し苦労しています。だから私はいくつかのコントローラが使用しているモジュール(懸念事項)を持っています。そのモジュール(ValidateAdmin)は、current_userとlogged_in_userの2つの他の関数を呼び出します。ほとんどの可能性をカバーするために、私はこれらの関数をスタブして戻り値を設定したかったのです。どのようにこの作品を作るための任意の提案?コントローラのRSpecモッキングモジュールの機能

describe ValidateAdmin do 
    before :all do 
    class FakeController < ApplicationController 
     include ValidateAdmin 
    end 
    end 

let(:controller) { FakeController.new } 

describe '#validate_admin_logged_in' do 
    controller.stub(:current_user).and_return(instance_double(User, admin?: true)) 
    controller.stub(:logged_in_user).and_return(instance_double(User, admin?: true)) 
    [RSpec contexts go here] 

編集 - 私の模擬声明文を 'before'ブロック内に入れることで修正しました。また、実現されたスタブは廃止されており、ステートメントを許可するように切り替えられました。

+0

現在のコードではどうなりますか? –

+0

@MohammadAbuShady質問にそのことを書いてくれて申し訳ありませんが、少し急いでいました。非常に奇妙なエラーを投げていましたが、私はそれを 'before'ブロックに入れることで修正しました。私の部分ではダムの間違いですが、応答に感謝します。 – jdune

答えて

0

コントローラインスタンスは、他のオブジェクトと同様にスタブすることができます。また、必要に応じてルートを追加する必要があります。

describe FakeController, type: :controller do 
    let(:admin_user) { instance_double(User, admin?: true) } 

    it "performs my excellent test" do 
    allow(controller).to receive(:current_user).and_return(admin_user) 
    routes.draw { get "custom_action" => "fake#custom_action" } 
    get :custom_action 
    end 
end 

let(:controller) uneccessaryある - RSpecのはあなたのためのことを行います。また、テストクラスはブロックbeforeに入る必要はありません。ファイルの先頭に定義するか、require-dを指定するだけです。

+0

私の問題は、私がスタブのステートメントをどこに持っていたかで、私が以前のブロックに入れていた奇妙なエラーを修正しました。私はそれが非難されたことがわかったので、またスタブから許可に変更されました。ありがとう! – jdune

関連する問題