Ruby on rails 未定义的方法`内容类型=';对于nil:send_数据中的nilclass

Ruby on rails 未定义的方法`内容类型=';对于nil:send_数据中的nilclass,ruby-on-rails,rspec-rails,content-type,Ruby On Rails,Rspec Rails,Content Type,我正在为我的控制器编写单元测试rspec 这是我的密码: 报告基础控制器.rb def send_data_to_report params[:user_role_code] = @auth_logic.current_role.code report_url = @report_logic.report_url(params) res = @request_logic.get(report_url) check_request_code(res.code.to_i, par

我正在为我的控制器编写单元测试rspec 这是我的密码:

报告基础控制器.rb

def send_data_to_report
  params[:user_role_code] = @auth_logic.current_role.code

  report_url = @report_logic.report_url(params)
  res = @request_logic.get(report_url)

  check_request_code(res.code.to_i, params)
  filename = params[:call_docurain_flag].to_i.zero? ? '' : "buildee_v2.#{Constants::REPORT_OUT_TYPE[params[:file_code].to_i]}"

  if params[:file_code].to_i == 2
    send_data(res.body, filename: filename, status: res.code, disposition: 'inline')
  else
    send_data(res.body, filename: filename, status: res.code)
  end 
end
describe "send_data_to_report 【帳票】出面及支払内訳書(請負)" do
  let(:report_setting) { create(:report_setting, report_code: '22',
    unit_code: 1, report_name: '【帳票】出面及支払内訳書(請負)') }

  let(:dummy_auth_logic) { double('dummy_auth_logic') }

  before do
    controller.instance_variable_set(:@auth_logic, dummy_auth_logic)
    controller.instance_variable_set(:@request_logic, dummy_request_logic)
    allow(dummy_auth_logic).to receive_message_chain(:current_role, :code).and_return(Roles::USER_ROLES[:PRIME])
    allow(dummy_report_logic).to receive(:report_url).and_return('')
    allow(dummy_http_response).to receive(:code).and_return(200)
    allow(dummy_http_response).to receive(:body).and_return('abc')
    allow(dummy_request_logic).to receive(:get).and_return(dummy_http_response)
  end
  it "Case 1" do
    expect(controller.send(:send_data_to_report)).to eq(true)
  end
end
报告基础控制器规范rb

def send_data_to_report
  params[:user_role_code] = @auth_logic.current_role.code

  report_url = @report_logic.report_url(params)
  res = @request_logic.get(report_url)

  check_request_code(res.code.to_i, params)
  filename = params[:call_docurain_flag].to_i.zero? ? '' : "buildee_v2.#{Constants::REPORT_OUT_TYPE[params[:file_code].to_i]}"

  if params[:file_code].to_i == 2
    send_data(res.body, filename: filename, status: res.code, disposition: 'inline')
  else
    send_data(res.body, filename: filename, status: res.code)
  end 
end
describe "send_data_to_report 【帳票】出面及支払内訳書(請負)" do
  let(:report_setting) { create(:report_setting, report_code: '22',
    unit_code: 1, report_name: '【帳票】出面及支払内訳書(請負)') }

  let(:dummy_auth_logic) { double('dummy_auth_logic') }

  before do
    controller.instance_variable_set(:@auth_logic, dummy_auth_logic)
    controller.instance_variable_set(:@request_logic, dummy_request_logic)
    allow(dummy_auth_logic).to receive_message_chain(:current_role, :code).and_return(Roles::USER_ROLES[:PRIME])
    allow(dummy_report_logic).to receive(:report_url).and_return('')
    allow(dummy_http_response).to receive(:code).and_return(200)
    allow(dummy_http_response).to receive(:body).and_return('abc')
    allow(dummy_request_logic).to receive(:get).and_return(dummy_http_response)
  end
  it "Case 1" do
    expect(controller.send(:send_data_to_report)).to eq(true)
  end
end
但是当我运行测试时,我收到了消息

Failure/Error: send_data(res.body, filename: filename, status: res.code)
NoMethodError:
 #   undefined method `content_type=' for nil:NilClass
 #   ./app/controllers/api/private/reports/report_base_controller.rb:35:in `send_data_to_report'

我无法理解
content\u type
属于哪个对象,因此无法解决问题。请帮我解决这个问题。感谢
内容\u type
是来自
ActionController::Request
的一种方法,您可以在此处找到更多信息:

我不完全确定如何修复错误,但问题是您试图模拟一个非常复杂的rails对象,并且缺少它所需的某些基本变量(
content\u type
,在本例中)

根据我的经验,我通常在控制器上进行集成测试,特别是因为RSPEC将为我处理所有的请求逻辑。如果您选择保留单元测试路径,那么您必须深入了解ActionController是如何工作的,以便模拟请求变量


祝你好运

尝试在send_data send_data(res.body,filename:filename,status:res.code,type:'image/jpeg')@SukeerthiAdiga我不能编辑报告\u base_控制器的代码,因为我正在为此控制器编写测试(哭泣)