Jestでファイル作成処理をテストする

2021.08.18

こんにちは、CX事業本部 IoT事業部の若槻です。

Jestは、JavaScriptのテスティングフレームワークです。

今回は、ファイル作成処理をJsetでテストしてみました。

やってみた

環境

% node --version
v12.14.0
$ npx jest --version
26.6.3
$ npx tsc -v
Version 3.9.10

テスト対象のコード

Jestのテスト対象とする処理のコードです。引数のBase64の画像データをjpegファイルへ書き込む処理を行います。またこの処理はAWS Lambda上で実行するため、書き込み先パスはtempディレクトリ配下となっています。

src/writeDataToFile.ts

import fs from "fs";
import path from "path";

export const writeDataToFile = (imageData: string) => {
  const data = imageData.replace("data:image/jpeg;base64,", "");
  const fileName = new Date().getTime() + ".jpeg";
  const filePath = path.join(__dirname, "temp", fileName);

  fs.writeFileSync(filePath, data, { encoding: "base64" });
};

テストコード

テストコードです。以下の3点のテストを行っています。3については今回は引数の値から作成内容が予測できる処理であるためテストできましたが、処理内容によってはテストできないかも知れません。

  1. 関数の返り値
  2. 作成されたファイル数
  3. 作成されたファイルの内容

test/writeDataToFile.test.ts

import { writeDataToFile } from "../src/writeDataToFile";
import fs from "fs";
import path from "path";

test("画像データをローカルファイルに書き込む", async (): Promise<void> => {
  //tempディレクトリの作成
  const tempPath = path.join(__dirname, "..", "src", "temp");
  fs.mkdirSync(tempPath);

  //ダミーデータを引数にテスト対象のモジュールを実行
  const dymmyDataPath = path.join(__dirname, "dummyData");
  const imageData = fs.readFileSync(dymmyDataPath).toString();
  const response = writeDataToFile(imageData);

  //作成されたファイルのパスと内容を取得
  const writtenFiles = fs.readdirSync(tempPath);
  const writtenData = fs
    .readFileSync(path.join(tempPath, writtenFiles[0]), "base64")
    .toString();

  //テスト
  expect(response).toBeUndefined; //1.関数の返り値
  expect(writtenFiles.length).toBe(1); //2.作成されたファイル数
  expect("data:image/jpeg;base64," + writtenData).toBe(imageData.trim()); //3.作成されたファイルの内容

  //後始末
  fs.unlinkSync(path.join(tempPath, "/", writtenFiles[0])); //作成したファイルの削除
  fs.rmdirSync(tempPath); //作成したディレクトリの削除
});

ダミーデータです。

test/dummyData

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/...

テストの実施

実行すると、テストが無事パスしました。

$ npx jest ./test/writeDataToFile.test.ts
ts-jest[config] (WARN) There is a mismatch between your NodeJs version v12.14.0 and your TypeScript target ES2020. This might lead to some unexpected errors when running tests with `ts-jest`. To fix this, you can check https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping
 PASS  test/writeDataToFile.test.ts
  ✓ 画像データをローカルファイルに書き込む (4 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.753 s
Ran all test suites matching /.\/test\/writeDataToFile.test.ts/i.

少しハマった箇所

作成されたファイルの内容のテストで、ダミーデータの内容に対してtrim()しているのは、私の環境ではデータ内容の末尾にPrettirにより改行が自動で入ってしまい、その削除のためです。少しハマりました。

test/writeDataToFile.test.ts

  //テスト
  expect(response).toBeUndefined; //1.関数の返り値
  expect(writtenFiles.length).toBe(1); //2.作成されたファイル数
  expect("data:image/jpeg;base64," + writtenData).toBe(imageData.trim()); //3.作成されたファイルの内容

参考

以上