Ошибка модульного тестирования Ruby Rspec AXLSX

#ruby-on-rails #ruby #unit-testing #rspec #axlsx

#ruby-on-rails #ruby #модульное тестирование #rspec #axlsx

Вопрос:

Вот мой код.

 wb = xlsx_package.workbook
wb.add_worksheet(name: 'my_work_sheet') do |sheet|
   sheet.add_row ['first row']
end
  

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

 it 'should write data in file' do
    workbook = double('Workbook')
    worksheet = double('Worksheet')

    expect(xlsx_package).to receive(:workbook).and_return(workbook)
    expect(workbook).to receive(:add_worksheet).with(name: 'my_work_sheet').and_return(worksheet)
    expect(worksheet).to receive(:add_row).with(['first row'])
end
  

Я получаю сообщение об ошибке «xlsx_package» не найдено

Комментарии:

1. Я получаю ту же проблему.

2. Это view тест? Можете ли вы предоставить полную информацию для вашего теста, по крайней мере, о том, с чем он связан (перед блоками / let / describe)?

3. Нет инструкций before / after /let . опишите блок следующим образом: опишите ‘report.xlsx.axlsx’, завершите фактическое имя файла ‘report.xlsx.axlsx’

Ответ №1:

Вот как xlsx_package назначается:

 def self.call(template)
  "xlsx_author = defined?(xlsx_author).nil? ? nil : xlsx_author;n"  
  "xlsx_created_at = defined?(xlsx_created_at).nil? ? nil : xlsx_created_at;n"  
  "xlsx_use_shared_strings = defined?(xlsx_use_shared_strings).nil? ? nil : xlsx_use_shared_strings;n"  
  "xlsx_package = Axlsx::Package.new(n"  
    ":author => xlsx_author,n"  
    ":created_at => xlsx_created_at,n"  
    ":use_shared_strings => xlsx_use_shared_stringsn"  
    ");n"  
  template.source  
  ";nxlsx_package.to_stream.string;"
end
  

https://github.com/straydogstudio/axlsx_rails/blob/afdcf7266b91f3d70c640209702257a635afddc4/lib/axlsx_rails/template_handler.rb#L13

Как вы можете видеть, вы не можете отключить это, но вы можете немного изменить свой тест:

 it 'should write data in file' do
  workbook = double('Workbook')
  worksheet = double('Worksheet')
  xlsx_package = double('Package', workbook: workbook)

  expect(Axlsx::Package).to receive(:new).and_return(xlsx_package)

  expect(xlsx_package).to receive(:workbook).and_return(workbook)
  expect(workbook).to receive(:add_worksheet).with(name: 'my_work_sheet').and_return(worksheet)
  expect(worksheet).to receive(:add_row).with(['first row'])
end
  

Я не могу привести вам полный пример, потому что вы не опубликовали свой шаблон представления.
Вам также необходимо понять, как рендеринг работает с тестами просмотра, потому что ваш тест по-прежнему недействителен.