【问题标题】:Controller test with RSPEC error does not implement带有 RSPEC 错误的控制器测试未实施
【发布时间】:2017-06-29 10:47:38
【问题描述】:

我正在尝试使用 RSPEC 测试我的 API 控制器。控制器中的操作有一个我想要存根/模拟的服务。但我得到了错误:

失败/错误:expect(Api::V1::PaymentsController).to 接收(:init_alias).and_return(svc) Api::V1::PaymentsController 未实现: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)) 但我得到了

失败/错误:expect(svc).to receive(:insert) (InstanceDouble(AliasService) (匿名)).insert(*(any args)) 预期:1 次,带任何参数 收到:0 次带任何参数

【问题讨论】:

    标签: ruby-on-rails ruby rspec mocking rspec-rails


    【解决方案1】:

    控制器方法是实例方法。因此,Api::V1::PaymentsController 没有实现init_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

    【讨论】:

    • 它几乎可以工作了,谢谢。但我仍然有第二个错误
    • alias_svc 传递到instance_variable_set。我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多