行動すれば次の現実

テック中心の個人ブログ

Axlsxで出力したExcelをRSpecでテストする方法

RubyでExcelのインポート、エクスポートを実装する場合は、Axlsxを使用することが多いかと思います。

Axlsxでエクセルをインポートする処理をRSpecでテストするというコードはよく見かけるのですが、 エクスポートに関してはあまり見たことがありません。

先日、弊社プロジェクトでExcelエクスポートのRSpecを書く機会がありましたので記事にまとめてみました。誰かの参考になれば幸いです。

github.com

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に格納されているデータタイプも変更されます。

単純な構成ですので、簡単にテストコードが実装できるかと思います。