🐙

テストファイルをテンプレートから自動生成したい

2023/08/04に公開

テストファイルをテンプレートから自動生成したい

始めに

基本的に、ロジックファイル(hooks系)はテストを書くようにしています。
しかし、テストファイルの準備が面倒だったので、テンプレートからコマンドでテストファイルを生成できるようにしてみました。

かなり簡単に導入できたので、テストファイル以外にも活用できたらなと思っています。

使用したライブラリは、scaffdogです。

設定

まずはパッケージをインストールします。

npm install --save-dev scaffdog
yarn add  -D scaffdog

次にnpxコマンドを実行すると、configファイルとデフォルトのテンプレートが作成されます。
ソースフォルダに、.scaffdog/comgig.js、.scaffdog/hello.mdが生成されているはずです。

npx scaffdog init

これで、以下のコマンドを実行するとコマンドで指定したフォルダに、デフォルトのテンプレートファイルを生成してくれます。
とても簡単。

yarn scaffdog generate

自分は、テストファイルのテンプレートを作りたかったので、以下のcreateSpecFile.mdを作成しました。

createSpecFile.md
---
name: 'createSpecFile'
root: '.'
output: './**/hooks'
ignore: []
questions:
  fileName: 'Please enter file name.'
---

# `{{ inputs.fileName }}.spec.ts`

```typescript
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';

describe('test', () => {
  it('test', () => {});

  it.each([
    {
      data1: 1,
      data2: 2,
      expected: 3,
    },
  ])('data1:$data1,data2:$data2 -> $expected', ({ data1, data2, expected }) => {
    expect(data1 + data2).toEqual(expected);
  });
});

終わりに

何度も同じファイルを生成するのが、割とめんどくさかったので、テンプレートから生成できるようになってよかったです。
テストファイル以外にも活用できるところがあれば積極的にテンプレート化していきたいと思いました〜!

追記

いろいろ試してわかったのですが、一度のコマンド実行で複数ファイルの自動生成も可能でした!
つまり、test.tsとtest.spec.ts両方とも同時に生成できます。

書き方としては簡単で、以下のようにファイル名とテンプレートを複数設置すればいいだけです。

createHooksFileAndSpecFile.md
---
name: 'createSpecFile'
root: '.'
output: './**/hooks'
ignore: []
questions:
  fileName: 'Please enter file name.'
---

# `{{ inputs.fileName }}.spec.ts`

```typescript
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';

describe('test', () => {
  it('test', () => {});

  it.each([
    {
      data1: 1,
      data2: 2,
      expected: 3,
    },
  ])('data1:$data1,data2:$data2 -> $expected', ({ data1, data2, expected }) => {
    expect(data1 + data2).toEqual(expected);
  });
});

# `{{ inputs.fileName }}.ts`

```typescript
export const {{inputs.fileName}} = () => {
  return {}
}

Discussion