JavaScript の単体テストを導入する
現在、Redmineには JavaScript の単体テストがありません。Node.js 環境での軽量な単体テストの導入を提案します。
前提とする環境: Node.js 16以降、yarn 1.22
単体テストのために導入するツール: mocha、chai、jsdom
このパッチを適用しても、プラグインやテーマを含む全てのRedmine開発者が、Node.js を導入する必要があるわけではありません。このパッチは、Node.js を JavaScript の単体テストを実行するためだけに使用しています(stylelint 導入のときと同じです)。
このパッチを適用し、 yarn install を実行するとテストに必要なツール群がインストールされます。
また、テスト追加の最初の事例として、 context_menu.js に対してテストを追加し、その上でリファクタリングを実施しました。
テスト対象となる JavaScript は、ESモジュール()です。 ESモジュールはデフォルトではグローバルな名前空間を使用しません。関数名の重複を恐れる必要がなくなります。context_menu.js は関数の名前の重複を避けるため全ての関数 “ContextMenu” というプレフィクスをつけていましたが、そうした行為は不要となります。
スクリプトをモジュール化することで、処理が遅延されるようになります。HTML ドキュメントが完全に準備できるまで待つため、これを進めていけばHTML処理の高速化が期待できます。
application.js を一気に全て esモジュール化するのは現実的ではないと思います。htmlに密結合した(onclick などを使用している)JavaScriptが多数あるからです。このあたりは他の手段も含め漸進的に改善していくものだと思います。