Vim によるファイルの保存と、Karma による Jasmine 単体テストの再実行との間の競合状態に陥っています。以下は、症状を示す一連の 4 つのテスト実行です (エラー ログの非常に長いパスは切り捨てました)。
$ karma start karma.conf.js --auto-watch
[... snip a lot of coding and test running ...]
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:19:57.252Z'
PhantomJS 1.6 (Linux): Executed 4 of 4 SUCCESS (0.307 secs / 0.013 secs)
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:20:09.866Z'
PhantomJS 1.6 (Linux): Executed 4 of 4 SUCCESS (0.288 secs / 0.012 secs)
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:20:14.366Z'
PhantomJS 1.6 (Linux) controller should have a breadcrumb after $routeChangeSuccess FAILED
Error: No module: myapp.question
at /home/rmunn/.../angular.js:1124
at ensure (/home/rmunn/.../angular.js:1065)
at module (/home/rmunn/.../angular.js:1296)
at /home/rmunn/.../angular.js:2806
TypeError: 'undefined' is not an object (evaluating 'rootScope.$broadcast')
at /home/rmunn/.../unit/controllersSpec.js:35
PhantomJS 1.6 (Linux): Executed 4 of 4 (1 FAILED) (0.312 secs / 0.014 secs)
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:20:28.588Z'
PhantomJS 1.6 (Linux): Executed 4 of 4 SUCCESS (0.287 secs / 0.013 secs)
これら 4 つの実行をトリガーするために行った唯一の変更は、question.js
ファイルから空白を追加および削除することでした。実質的なコード変更はありませんでしたが、実行 1、2、および 4 が成功したところで、実行 #3 が失敗しました。
私のVim構成はバックアップファイルを保持するように設定されており、デフォルトでは、Vimは元のファイルの名前を変更して新しいファイルを作成することにより、バックアップファイルを保持します. (ここでは適用されない特定の条件下を除きます)。私が考えているのは、私が競合状態を引き起こしているということです: Vim question.js
(または編集したファイル) の名前が変更され、Karma がその変更を検出してテストの実行を開始し、現在テストがほとんどないため、すべてのテストが実行されますLinux プロセス スケジューラが制御を Vim に戻す前に。Vim が再びスケジュールされると、 の新しいコンテンツが書き込まれますが、その時点までには、存在していて空でないquestion.js
ことに依存する Jasmine テストには遅すぎます。question.js
バックアップ ファイルを保持しないように Vim を構成することでこれを修正できる可能性がありますが、そのリスクを冒したくはありません。結局のところ、私がバックアップ ファイルを使用するのには理由があります。Karmaに「ファイルの変更を検出したら、Nミリ秒間一時停止してから単体テストを実行する」ように指示する方法はありますか? これはブルート フォース ソリューションですが、この特定の競合状態を解決します。または、他の賢いアイデアを提供できる人がいる場合は、それも聞きたいです。