2

ユニットテストをローカルで実行すると問題はありませんが、ビルドサーバーで最も愚かなことが起こります。メインコード: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
  • :のように私の心の中で簡単に処理が動作するはずです。おそらく、非同期にいくつかの問題がありますか?彼らが時には失敗する場合、私はテストをまったく使用することができないので、少しのヒントが大いに評価されます...

+1

大カッコと字下げが一致しないため、優先順位を見積もるのは難しいです! 'beforeEach'と' it'の両方が同じ 'describe( 'myController'、...)ブロックでホストされていることを考慮すると、問題を説明できる競合条件はなく、ブロックは同期していて、常に順番に実行されます。これは、アプリケーションが静かにブートストラップされず、 'inject'(コンソールにエラーがあるはずですが、PhantomJSは嚥下エラーとして知られています)にスローされた場合に発生します。 – estus

+0

estus、ご意見ありがとうございます。ホスティングは大丈夫ですが、注射で何かをしなければならない可能性があります。最初の行でrequirejs defineを削除すると、エラーをローカルで再現できるようになりました。私の場合は「剣道/剣道。分」です。しかし、なぜこれが注入エラーを引き起こすか、それを修正する方法を理解できません。何か案は?もし私が今までに見つけたら解決策を投稿します... – timtos

+0

原因は文字どおりにブートストラッププロセスに関わるものです。 KarmaランチャーをChromeに変更して、エラー出力が改善されるかどうかを確認できます。 'beforeEach'から' it'に 'inject'を動かすこともできます。なぜ剣道が最初にあったのですか?単体テストでは、アプリケーションユニットがテストされ、他のものはすべて嘲笑されなければなりません。余分な依存関係があれば、動く部品が仕様に追加されます(それは分かりません)。 – estus

答えて

6

問題を説明する可能性のある競合状態はなく、ブロックは同期し、常に順番に実行されます。これは、アプリケーションが自動的にブートストラップされずにinjectにスローされた場合に発生する可能性があります。

コンソールにエラーがあるはずですが、PhantomJSは嚥下エラーとして知られています.KarmaランチャーをChromeに変更するとエラー出力が改善される可能性があります。

injectbeforeEachからitに移動すると、問題が見つかるのを助けることもできますが、失敗したことに失敗するのではなく、この期待が失敗するというエラーに失敗します。

ユニットテストでは、アプリケーションユニットがテストされ、他のすべてが嘲笑され、余分な依存関係があります(剣道UI用の角度ラッパー)。

関連する問題