在controller_spec中测试对象的实例化,然后在结果对象上调用方法失败

时间:2015-03-02 19:41:57

标签: ruby-on-rails rspec

我已经获得了一个看起来像这样的控制器规范

describe ExportController do
  describe 'GET index' do
    target_params = {type:'a', filter: 'b'}
    expect(DataFetcher).to receive(:new).with(target_params)
    get :index
  end
end

控制器看起来像这样

class ExportController < ApplicationController
  def index
    @fetcher = DataFetched.new(target_params)

    ...
  end
end

如果我像这样运行规范,一切都很酷。但是我想对生成的DataFetcher对象做一些事情

class ExportController < ApplicationController
  def index
    @fetcher = DataFetcher.new(target_params)
    @list = @fetcher.fetch_list
    ...
  end
end

现在,当我运行规范时,它失败并出现无方法错误

NoMethodError
  undefined method 'fetch_list' for nil:NilClass

那是什么?问题是,当我通过我的实际应用程序点击此控制器时,它按预期工作。 rspec在幕后做了什么,我将如何正确设置?

感谢所有

2 个答案:

答案 0 :(得分:1)

您的expect语句导致nilnew返回fetch_list,而fetch_list未定义expect(DataFetcher).to receive(:new).with(target_params) .and_return(instance_double(DataFetcher, fetch_list: []) 。如果您希望该行成功,您将需要返回实现{{1}}方法的内容,如下所示:

{{1}}

答案 1 :(得分:1)

或者您也可以在末尾添加:.and_call_original,哪个恕我直言更干净

expect(DataFetcher).to receive(:new).with(target_params)
  .and_call_original