RubyでExcelのインポート、エクスポートを実装する場合は、Axlsxを使用することが多いかと思います。
Axlsxでエクセルをインポートする処理をRSpecでテストするというコードはよく見かけるのですが、 エクスポートに関してはあまり見たことがありません。
先日、弊社プロジェクトでExcelエクスポートのRSpecを書く機会がありましたので記事にまとめてみました。誰かの参考になれば幸いです。
Axlsxで出力したExcelの内容をRSpecでテストする方法
ExcelExportServiceというExcel出力用クラス(①)をテストするにあたり、出力されたExcelファイル(②)をRSpecでアサーション(③)する場合を想定して説明します。
▼ ① ExcelExportServiceの実装内容(一部抜粋)
class ExcelExportService def call Axlsx::Package.new do |p| p.workbook.add_worksheet(name: 'Materials') do |sheet| # 出力処理が実装されている end end end end
▼ ② 出力されたExcel
▼ ③ RSpecのテストコード
package = ExcelExportService.new.call expect(package.workbook.worksheets[0].rows[0][0].value).to eq 'No' expect(package.workbook.worksheets[0].rows[0][1].value).to eq '名字' expect(package.workbook.worksheets[0].rows[0][2].value).to eq '名前' expect(package.workbook.worksheets[0].rows[0][3].value).to eq '年齢' expect(package.workbook.worksheets[0].rows[1][0].value).to eq 1 expect(package.workbook.worksheets[0].rows[1][1].value).to eq '田中' expect(package.workbook.worksheets[0].rows[1][2].value).to eq '太郎' expect(package.workbook.worksheets[0].rows[1][3].value).to eq '30' expect(package.workbook.worksheets[0].rows[2][0].value).to eq 2 expect(package.workbook.worksheets[0].rows[2][1].value).to eq '山田' expect(package.workbook.worksheets[0].rows[2][2].value).to eq '花子' expect(package.workbook.worksheets[0].rows[2][3].value).to eq '34'
ExcelExportService.new.call(①)はAxlsx::Packageオブジェクトを返却しています。 テストコード(③)には、出力されたエクセル(②)と対応する形で、1次元配列や2次元配列形式で対象データを特定してアサーションを実行しています。
Axlsx::Packageオブジェクトにはworkbookというオブジェクトが格納されており、さらにその下にworksheetsオブジェクト、rowsオブジェクトが格納されています。
# 以下の構成でオブジェクトが格納されている Axlsx::Package >> Axlsx::Workbook >> Axlsx::Worksheet >> Axlsx::Row
Axlsx::Worksheetは一次元配列の形式であり、Excelのシートと対応しています。
Axlsx::Rowは二次元配列の形式であり、1つ目の配列が行番号、2つ目の配列が列番号に対応しています。 また、セルの表示形式によってAxlsx::Rowに格納されているデータタイプも変更されます。
単純な構成ですので、簡単にテストコードが実装できるかと思います。