2016-03-25 10 views
2

私たちのコントローラが、私たちが持っているparamに基づいて与えられた回数だけクラスを呼び出していることをテストしようとしていますが、rspecでテストが失敗しています。クラスはゼロを返す。ruby​​ Class.new rspecでnilを返しています

class ProcessFaxesController < ApplicationController 
    def create 
    email = params["From"] 
    attachment_count = params["attachment-count"].to_i 
    head :ok 

    if attachment_count > 0 
     attachment_count.times do |document_index| 
     FaxedDocumentProcessor.new(params, document_index+1).perform 
     end 
    else 
     DocumentProcessingMailer.delay.failure_notification(email, "No attachment found.") 
    end 
    end 
end 

外部クラス::これは、我々は我々のテストから取得しているエラーがある

require 'rails_helper' 

RSpec.describe ProcessFaxesController, type: :controller do 
    context "#create" do 
    context 'with attachments' do 
     before { allow_any_instance_of(FaxedDocumentProcessor).to receive(:perform).and_return(true) } 

     it 'calls the FaxedDocumentProcessor attachment-count times' do 
     expect(FaxedDocumentProcessor).to receive(:new).twice 
     post :create, 'email' => '[email protected]', 'attachment-count' => 2) 
     end 
    end 
    end 
end 

:このスペックで

class FaxedDocumentProcessor 
    def initialize(params, document_index) 
    @params = params 
    @attachment = @params["attachment-#{document_index}"] 
    @email = @params['From'] 
    end 

    def perform 
    # some stuff here 
    end 
end 

私たちは、このコントローラーを持っています

Failures: 

    1) ProcessFaxesController#create with attachments calls the FaxedDocumentProcessor attachment-count times 
    Failure/Error: FaxedDocumentProcessor.new(params, document_index+1).perform 

    NoMethodError: 
     undefined method `perform' for nil:NilClass 
    # ./app/controllers/process_faxes_controller.rb:20:in `block in create' 
    # ./app/controllers/process_faxes_controller.rb:19:in `times' 
    # ./app/controllers/process_faxes_controller.rb:19:in `create' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/abstract_controller/base.rb:198:in `process_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/action_controller/metal/rendering.rb:10:in `process_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/abstract_controller/callbacks.rb:20:in `block in process_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:117:in `call' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:555:in `block (2 levels) in compile' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:505:in `call' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:92:in `__run_callbacks__' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:778:in `_run_process_action_callbacks' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/callbacks.rb:81:in `run_callbacks' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/abstract_controller/callbacks.rb:19:in `process_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/action_controller/metal/rescue.rb:29:in `process_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/action_controller/metal/instrumentation.rb:32:in `block in process_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/notifications.rb:164:in `block in instrument' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/notifications.rb:164:in `instrument' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/action_controller/metal/params_wrapper.rb:250:in `process_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/abstract_controller/base.rb:137:in `process' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionview-4.2.6/lib/action_view/rendering.rb:30:in `process' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/action_controller/test_case.rb:639:in `process' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/action_controller/test_case.rb:67:in `process' 
    # /Users/mary/.rvm/gems/[email protected]/gems/devise-3.5.6/lib/devise/test_helpers.rb:19:in `block in process' 
    # /Users/mary/.rvm/gems/[email protected]/gems/devise-3.5.6/lib/devise/test_helpers.rb:72:in `catch' 
    # /Users/mary/.rvm/gems/[email protected]/gems/devise-3.5.6/lib/devise/test_helpers.rb:72:in `_catch_warden' 
    # /Users/mary/.rvm/gems/[email protected]/gems/devise-3.5.6/lib/devise/test_helpers.rb:19:in `process' 
    # /Users/mary/.rvm/gems/[email protected]/gems/actionpack-4.2.6/lib/action_controller/test_case.rb:520:in `post' 
    # ./spec/controllers/process_faxes_controller_spec.rb:22:in `block (4 levels) in <top (required)>' 

binding.pryをコントローラメソッドに挿入しようとしましたが、呼び出しを試みるたびにエラーは発生しません。

FaxedDocumentProcessor.newには何も返されない可能性がありますか?なぜ私たちはエラーを再現できないのですか?

+0

あなたの質問は不明です。あなたのコードには 'Class.new'の呼び出しはありません。これは 'Class.new'と何が関係していますか?クラスを動的に生成しているわけではありません。 –

答えて

10

これは本によって引き起こされる:完全スタブnew方法上記

expect(FaxedDocumentProcessor).to receive(:new).twice 

ライン。それは、元のメソッドを呼び出すようにするには、実行します。

expect(FaxedDocumentProcessor).to receive(:new).twice.and_call_original 

ドキュメント:https://www.relishapp.com/rspec/rspec-mocks/v/2-14/docs/message-expectations/calling-the-original-method

+1

オハイオ州クール、それは働いた。今日何か新しいことを学んだ、ありがとう! – oolong

関連する問題