uki00a.github.io

deno test --docでREADME.mdをうまくテストする

#deno

はじめに

Deno v1.13からdeno test --docコマンドでMarkdownファイルがサポートされました。

この機能を利用することで、README.mdなどに記述したサンプルコードの型チェックをすることができます。

そのため、Denoモジュールをdeno.land/xnest.landなどに公開する場合、サンプルコードが正しく動作することを保証するのにとても役立ちます。

問題

README.mdなどにサンプルコードを記述する際は、以下のようにimport節にはdeno.land/xの公開URLを記述することが一般的だと思います。

例)

  ## Usage

  ```ts
  import { connect } from "https://deno.land/x/redis/mod.ts";
  
  const redis = await connect({ hostname: "127.0.0.1" });
  await redis.set("foo", "bar");
  const value = await redis.get("foo");
  console.assert(typeof value === "string");
  await redis.del("foo");
  ```

この場合、モジュールはhttps://deno.land/x/redis/mod.tsから読み込まれてしまうため、CIなどで最新状態のソースに対してテストができない問題があります。

解決策

この問題はImport mapsを使用することで解決できます。

以下のようにimport_map.test.jsonを用意します。

{
  "imports": {
    "https://deno.land/x/redis/mod.ts": "./mod.ts"
  }
}

そして、deno test --docコマンドを実行する際に--import-mapオプションでこのファイルを指定します。

$ deno test --doc --no-run --import-map=import_map.test.json README.md

こうすることで、https://deno.land/x/redis/mod.ts./mod.tsの読み込みに置き換えられるため、ローカルの最新状態のmod.tsに対してテストすることができます。

参考

環境

  • Deno v1.13.1