2017-06-29 15 views
1

RSPECでAPIコントローラーをテストしようとしています。コントローラ内のアクションは、私がスタブ/モックしたいサービスを持っています。ここに私のテストRSPECエラーのコントローラーテストが実装されていません

Failure/Error: expect(Api::V1::PaymentsController).to receive(:init_alias).and_return(svc) Api::V1::PaymentsController does not implement: init_alias

let(:alias_svc) { instance_double(AliasService) } 

    describe 'POST /payment/card' do 
    it 'returns urls (return, success, fail)' do 
     expect(Api::V1::PaymentsController).to receive(:init_alias).and_return(alias_svc) 
     expect(alias_svc).to receive(:insert) 

     post '/payment/card' 
    end 
    end 

とコントローラ:

module Api 
    module V1 
    class PaymentsController < ApiController 
     before_action :init_alias, only: [:register_card] 

     # POST /payment/card 
     def register_card 
      @url = @svc.insert current_user 
     end 

     private 
     def init_alias 
     @svc = AliasService.new 
     end 

    end 
    end 
end 

編集:

私は最初の行を削除しようとしましたが(しかし、私はエラーを得ましたexpect(Api :: V1 :: PaymentsController).to receive(:init_alias).and_return(alias_svc ))しかし、私は得た

Failure/Error: expect(svc).to receive(:insert) (InstanceDouble(AliasService) (anonymous)).insert(*(any args)) expected: 1 time with any arguments received: 0 times with any arguments

答えて

2

コントローラメソッドはインスタンスメソッドです。したがって、Api::V1::PaymentsControllerinit_aliasを実装していません。

RSpecのはexpect_any_instance_ofを使用することができます:

expect_any_instance_of(Api::V1::PaymentsController).to receive(:init_alias).and_return(alias_svc) 

編集

あなたは@svcにあなたのメッセージを送信します。したがって、このインスタンス変数をコントローラにモックする必要があります。

あなたはこのような何かを行うことができます。

let(:alias_svc) { instance_double(AliasService) } 
controller.instance_variable_set(:@svc, alias_svc) 

More detailsを。

+0

これはほとんど動作しています、ありがとうございます。しかし、私はまだ2番目のエラーを持っています – Xero

+0

'instance_variable_set'に' alias_svc'を渡します。私は答えを更新しました。 – yzalavin

関連する問題