我正在尝试使用RSPEC测试我的API控制器。控制器中的操作有一个我想要存根/模拟的服务。但我得到了错误:
失败/错误:期待(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
修改:
我试图删除第一行(期望(Api :: V1 :: PaymentsController)。接收(:init_alias).and_return(alias_svc))但我得到了
失败/错误:期待(svc)。接收(:插入) (InstanceDouble(AliasService)(匿名))。insert(*(any args)) 预期:任何参数1次 收到:0次带有任何参数
答案 0 :(得分:4)
控制器方法是实例方法。因此,java -jar /path/to/jenkins-cli.jar -s http://127.0.0.1:2206/ install-plugin github-api --username admin --password password
未实施Api::V1::PaymentsController
。
RSpec允许使用init_alias
:
expect_any_instance_of
修改强>
您将邮件发送至expect_any_instance_of(Api::V1::PaymentsController).to receive(:init_alias).and_return(alias_svc)
。因此,您应该将此实例变量模拟到控制器。
您可以这样做:
@svc