ユニットテストをローカルで実行すると問題はありませんが、ビルドサーバーで最も愚かなことが起こります。メインコード:beforeEachはangularjs/requirejsのシナリオでKarma/Jasmine経由で呼び出されません
TypeError: undefined is not an object (evaluating 'scope.myImportantAssignment = variableName')
を、コンソール上で、私は読むことができます::
define(['angmock', 'someMore'], function() {
describe('myController', function() {
beforeEach(function() {
console.log("Entry - Initializing modules...");
module('module1');
module('module2');
console.log("Exit - Initializing modules...");
});
var scope, controller;
beforeEach(inject(function ($rootScope, $controller) {
console.log("Entry - Creating scope...");
scope = $rootScope.$new();
controller = $controller('myController', {
$scope: scope
});
console.log("Exit - Creating scope...");
}));
it('should test something', function() {
console.log("Entry - Test A");
scope.myImportantAssignment = variableName;
...
console.log("Exit - Test A");
});
...
ビルドサーバーログでは、私は時々読むことができます
- LOG:「エントリを - モジュールを初期化しています。 .. '
- ログ:' Exit - Initializing modules ... '
- LOG:' Entry-Test A '
これは、2番目のbeforeEachがまったく呼び出されないため、スコープが初期化されていないことを示しています。しかし、なぜ?
しかし、それはケースのように思われない
- beforeEach 1
- beforeEach 2
- :のように私の心の中で簡単に処理が動作するはずです。おそらく、非同期にいくつかの問題がありますか?彼らが時には失敗する場合、私はテストをまったく使用することができないので、少しのヒントが大いに評価されます...
大カッコと字下げが一致しないため、優先順位を見積もるのは難しいです! 'beforeEach'と' it'の両方が同じ 'describe( 'myController'、...)ブロックでホストされていることを考慮すると、問題を説明できる競合条件はなく、ブロックは同期していて、常に順番に実行されます。これは、アプリケーションが静かにブートストラップされず、 'inject'(コンソールにエラーがあるはずですが、PhantomJSは嚥下エラーとして知られています)にスローされた場合に発生します。 – estus
estus、ご意見ありがとうございます。ホスティングは大丈夫ですが、注射で何かをしなければならない可能性があります。最初の行でrequirejs defineを削除すると、エラーをローカルで再現できるようになりました。私の場合は「剣道/剣道。分」です。しかし、なぜこれが注入エラーを引き起こすか、それを修正する方法を理解できません。何か案は?もし私が今までに見つけたら解決策を投稿します... – timtos
原因は文字どおりにブートストラッププロセスに関わるものです。 KarmaランチャーをChromeに変更して、エラー出力が改善されるかどうかを確認できます。 'beforeEach'から' it'に 'inject'を動かすこともできます。なぜ剣道が最初にあったのですか?単体テストでは、アプリケーションユニットがテストされ、他のものはすべて嘲笑されなければなりません。余分な依存関係があれば、動く部品が仕様に追加されます(それは分かりません)。 – estus