在控制器中调用对象方法的Rspec测试

时间:2016-02-02 11:44:04

标签: ruby-on-rails rspec

我想测试一个控制器创建和更新动作调用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

有什么想法吗? 感谢。

2 个答案:

答案 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)