如何在rspec中正确使用存根进行测试

时间:2016-01-27 16:29:39

标签: ruby-on-rails ruby rspec stubbing

所以,我在课堂上有一个方法如下:

def installation_backlog
  Api::Dashboards::InstallationsBacklog.new(operational_district_id, officer_id).backlog_tasks
end

我想说明一下。所以,我刚刚写了一个RSpec测试来测试它如下:

it "should call a new instance of InstallationsBacklog with the backlog_tasks method" do
  expect_any_instance_of(Api::Dashboards::InstallationsBacklog).to receive(:backlog_tasks)
  @installation_officer.installation_backlog # @installation_officer is a new instance of the container class.
end

这是有效的。

然而,我开始怀疑这是否是一种正确的做法。喜欢:我确定即使我存在错误(可能不存在)的方法,并测试它,它会通过还是失败?

我试过了,它通过了

因此,如果稍后更改方法名称,则此测试无法检测到该方法。

所以,问题是:我怎样才能确定代码中实际存在RSpec存根方法?

1 个答案:

答案 0 :(得分:1)

以下是我如何设置它的方法。可能会帮助..

let(:backlog) {
  double('Backlog', backlog_tasks: [])
}

before do
  allow(Api::Dashboards::InstallationsBacklog).to receive(:new).
    and_return(backlog)
end

it 'instantiates InstallationBacklog' do
  expect(Api::Dashboards::InstallationBacklog).to receive(:new).
    with(operational_district_id, officer_id)

  @installation_officer.installation_backlog
end

it 'calls backlog_tasks on instance of InstallationBacklog' do
  expect(backlog).to receive(:backlog_tasks)

  @installation_officer.installation_backlog
end