неопределенный метод `content type = 'для nil: nilclass в send_data - PullRequest
0 голосов
/ 20 февраля 2020

Я пишу модульный тест rspe c для моего контроллера. Вот мой код:

report_base_controller.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

report_base_controller_spe c .rb

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_type принадлежит какому объекту, поэтому я могу не решить проблему. Пожалуйста, помогите мне решить эту проблему. Спасибо

1 Ответ

0 голосов
/ 20 февраля 2020

content_type - метод из ActionController::Request, и дополнительную информацию можно найти здесь: https://guides.rubyonrails.org/action_controller_overview.html

Я не совсем уверен, как вы можете исправить ошибку, но проблема в том, что вы пытаетесь смоделировать очень сложный объект rails, и вам не хватает определенных базовых переменных, которые ему требуются (в данном случае content_type).

По моему опыту я обычно делаю интеграционный тест на контроллеры, особенно потому, что RSPE C будет обрабатывать все логи запроса c для меня. Если вы решите сохранить маршрут модульного тестирования, вам нужно будет глубоко понять, как работает ActionController, чтобы смоделировать переменные запроса.

Удачи!

...