7

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ミリ秒間一時停止してから単体テストを実行する」ように指示する方法はありますか? これはブルート フォース ソリューションですが、この特定の競合状態を解決します。または、他の賢いアイデアを提供できる人がいる場合は、それも聞きたいです。

4

2 に答える 2

3

この GitHubの問題でも、この問題について説明しています。Vim は、元のファイルを移動して新しいファイルを書き込む代わりに、元のファイルをコピーしてから上書きすることでバックアップを作成するように構成できます。これは技術的には質問に対する回答ではありませんが、問題を解決するには十分なはずです。

set backupcopy=yes

Vim はその場でファイルを編集し、Karma はこれを「削除」ではなく「変更」として検出します。

詳細:help 'backupcopy'については、次を参照してください。

                        *'backupcopy'* *'bkc'*
'backupcopy' 'bkc'  string  (Vi default for Unix: "yes", otherwise: "auto")
            global
            {not in Vi}
    When writing a file and a backup is made, this option tells how it's
    done.  This is a comma separated list of words.

    The main values are:
    "yes"   make a copy of the file and overwrite the original one
    "no"    rename the file and write a new one
    "auto"  one of the previous, what works best
于 2014-08-12T14:36:20.407 に答える