ruby-on-rails - 带有 RSPEC 错误的 Controller 测试未实现

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

我正在尝试使用 RSPEC 测试我的 API Controller 。 Controller 中的操作有一个我想 stub /模拟的服务。但是我得到了错误:

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

和 Controller :

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

最佳答案

Controller 方法是实例方法。因此,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。因此,您应该将此实例变量模拟到您的 Controller 。

你可以这样做:

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

More details .

关于ruby-on-rails - 带有 RSPEC 错误的 Controller 测试未实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44823053/

相关文章:

ruby-on-rails - 在 Windows 上为网站使用 rails 或 ASP.NET

ruby-on-rails - 在 Ruby on Rails 中发送动态电子邮件提醒?

ruby - simple_form 的 collection_radio_button 和自定义标签类

ruby-on-rails - 根据年龄或日期编写 rspec 测试

ruby - 如何为具有包含 ruby​​ 关键字的字段的表编写 factorygirl?

ruby-on-rails - 了解 Rspec stub 和 Controller 测试

ruby-on-rails - Ruby on Rails 两个模型之间的多重多对多关系

ruby-on-rails - 将 'belongs_to' 添加到 Rails 应用程序中的模型后测试失败

ruby-on-rails - 没有路由与发布请求中的 [GET] 匹配

ruby-on-rails - 在 Rails 中向 Integer 类添加方法的最佳位置在哪里?