我想测试一个控制器创建和更新动作调用MentionService实例上的一个进程方法。
在控制器中我有MentionService.new(post).process
这是我目前的规格:
it "calls MentionService if a post has been submitted" do
post = Post.new(new_post_params)
mention_service = MentionService.new(post)
expect(mention_service).to receive(:process)
xhr(:post, :create, company_id: company.id, remark: new_post_params)
end
在控制器操作中我有:
def create
...
# after save
MentionService.new(@remark).process
...
end
我得到的是:
expected: 1 time with any arguments
received: 0 times with any arguments
有什么想法吗? 感谢。
答案 0 :(得分:4)
问题是您在测试中创建了一个新实例,并希望该实例能够接收:process
,但这不起作用。
尝试使用此代码段:
let(:service) { double(:service) }
it "calls MentionService if a post has been submitted" do
expect(MentionService).to receive(:new).with(post).and_return(service)
expect(service).to receive(:process)
xhr(:post, :create, company_id: company.id, remark: new_post_params)
end
您需要告诉您的MentionService
班级接收:new
并返回一个模拟对象,该对象将收到:process
。如果是这种情况,您就知道呼叫序列成功了。
答案 1 :(得分:2)
如果您对自己提供模拟对象不感兴趣,还可以将您的期望修改为:
expect_any_instance_of(MentionService).to receive(:process)