2017-06-29 3 views
1

J'essaye de tester mon contrôleur d'API avec RSPEC. L'action dans le contrôleur a un service que je veux stub/mock. Mais je suis erreur:Le test du contrôleur avec l'erreur RSPEC n'implémente pas

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

Voici mon test:

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 

Et le contrôleur:

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 

Edit:

J'ai essayé de supprimer la première ligne (attend (Api :: V1 :: PaymentsController) .pour recevoir (: init_alias) .et_return (alias_svc)) mais j'ai

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

Répondre

2

Les méthodes de contrôleur sont des méthodes d'instance. Par conséquent, Api::V1::PaymentsController n'implémente pas init_alias.

RSpec permet d'utiliser expect_any_instance_of:

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

Modifier

Vous envoyez votre message à @svc. Par conséquent, vous devez simuler cette variable d'instance sur votre contrôleur.

Vous pouvez faire quelque chose comme ceci:

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

More details.

+0

ça marche presque, merci. Mais j'ai toujours la deuxième erreur – Xero

+0

Passez 'alias_svc' dans' instance_variable_set'. J'ai mis à jour la réponse. – yzalavin