SAFE Stack のサンプルの ToDo アプリを一通り見て、テストも含まれているのを知った。 SAFE Stack のドキュメントにテストの実行方法が書かれている。(link)

サーバとクライアントの両方のテストを実行

dotnet run Runtests コマンドを走らせるとツラツラとメッセージが流れていくなかに、Expecto でサーバのテストを実行した結果が表示されていた。 そして、このコマンドを走ったままにして http://対象ホスト:8081/ を開くと、Fable.Mocha でクライアントのテストを実行した結果が表示される。

なお、 dotnet run Runtests をしたときにサーバのテストが失敗しても、続けてクライアントのテストが走ってしまう。 メッセージをよくチェックしていないと、サーバのテスト失敗を見落しそう。

サーバのテストのみ実行

サーバのテストだけ実行するなら dotnet run -p tests/Server/Server.Tests.fsprojdotnet watch run -p tests/Server/Server.Tests.fsproj でよさそう。 watch 付きにすると、サーバ本体 (src/Server/Server.fs) とテスト (tests/Server/Server.Tests.fs) のどちらを更新しても検知してテストを再実行してくれる。

シェル上でテストを結果が取得できるから、CI に組み込むのも大丈夫そう。

クライアントのテストのみ実行

クライアントのテストだけ実行したいなら npm run test:live でよさそうなことが SAFE Stack のドキュメントに書かれている。 この場合も http://対象ホスト:8081/ でテスト結果が表示される。 (参考までに dotnet run -p tests/Client/Client.Tests.fsproj だと動かない。)

ただし、この npm コマンドで実行する方法は、Fable で JavaScript にコンパイルした結果 (tests/Client/Client.Tests.fs.js) が存在することを前提にしている。 また、テストコードを変更しても JavaScript に再コンパイルされない。

クライアントのテストで使えそうなコマンドをいくつか試しながら、やり方を考えてみた。

  • tests/Client/ のクリーンアップ
    • コマンド: dotnet fable clean tests/Client/ --yes
  • tests/Client/ のビルド
    • コマンド1: dotnet fable tests/Client/
      • 注意: ソースに変更が無くてもコンパイルが走ってしまう。
    • コマンド2: dotnet fable watch tests/Client/
      • 注意: ソースに変更が無くても最初の1回はコンパイルが走ってしまう。
  • tests/Client/ の実行
    • コマンド: npm run test:live
      • 注意: 別途、ビルドしないといけない。

結論:
クライアントのテストを頻繁に再実行したいなら、 dotnet fable watch tests/Client/npm run test:live の両方を実行したままにするがよさそう。 テストを変更したら、ブラウザの画面がホットリロードされてテストを再実行してくれた。

残課題:
シェル上でテスト結果を取得する方法が分かってない。

2021-08-04 追記: アプリケーションとテストの同時実行

SAFE Stack のプロジェクトを作成したとき一緒に作られるデフォルトの README.md を見たら、 dotnet rundotnet run Runtests を並行して実行してよいらしい。 以下に引用する。(一部、折り返しを追加)

To concurrently run the server and the client components in watch mode use the
following command:

```bash
dotnet run
```

Then open `http://localhost:8080` in your browser.

The build project in root directory contains a couple of different build targets.
You can specify them after `--` (target name is case-insensitive).

To run concurrently server and client tests in watch mode
(you can run this command in parallel to the previous one in new terminal):

```bash
dotnet run -- RunTests
```

[さらに追記] 実際に dotnet rundotnet run Runtests を同時に実行してみたけど問題があった。 やはり……。 本体のソース (src/ 配下) を更新すると、おかしくなってコンパイルが進まない。