2

これは、私が尋ねた別の質問の続きで、うまく答えられました。

Karma、Jasmine、および ngMock を使用して AngularJS アプリケーションを単体テストする方法を学んでいます。質問があるコードは次のとおりです。

describe('myController function', function() {

  describe('myController', function() {
    var scope;

    beforeEach(module('myApp'));

    beforeEach(inject(function($rootScope, $controller) {

      // These are the 2 lines I'm a bit confused about:
      scope = $rootScope.$new();
      $controller('MyController', {$scope: scope});

    }));

    it("...");
  });
});

質問 1:scope新規を作成して、この行の locals インジェクション エリアに含めるのはなぜ$controller('MyController', {$scope: scope});ですか? それは問題なく動作しているように見えます (scope現在、そのコントローラーのオブジェクトを表し、$scope想定されているすべてのプロパティと機能を備えています) が、コードは、コントローラー$scopeを新しく作成した (そして空の) scope(行からscope = $rootScope.$new();)。ですから、私はそれらの地元の人々の目的/内部の仕組みを完全に理解していないと思います.

質問 2:検索の結果、 newscopeが 2 つの一般的な方法で作成される$rootScope.$new()こともわかりscope = {}ました。Angular のドキュメントでさえ、ここ (を使用) とここ (を使用) に見られるように、両方の方法でそれを行っていますなぜ$rootScope.$new()これ$scope = {}の方法で行うのですか?違いはありますか?

4

1 に答える 1

3

新しいスコープを作成する理由

思いつく理由はいくつかありますが、簡単に言えば、したくない場合は必要ないということです簡単に合格でき$rootScope、テストは引き続き機能します。これは、Angular で実際に発生することとより一致しているため、通常は行われます。$scopeコントローラーに注入されるのは、 の子孫である可能性があり$rootScopeます。

$controller('MyController', {$scope: scope}); とは してる?

ngMockモジュールは、$controllerコントローラーを作成するための一種のコンストラクターとして関数を提供します。技術的には、モジュール内の関数のデコレーターです$controllerng、それは重要ではありません。最初の引数は通常文字列ですが、関数にすることもできます。

関数で呼び出された場合、コントローラーのコンストラクター関数と見なされます。それ以外の場合は、コントローラーのコンストラクターを取得するために使用される文字列と見なされます...

2 番目の引数は、作成中にコントローラーに注入される「ローカル」です。

したがって、あなたの例では、「MyController」コントローラーを作成し、コントローラー関数で指定されscopeた引数として変数を注入したいと言っています。$scope

これの全体的なポイントは、コントローラーに独自のバージョンを挿入するscopeことですが、テストで作成したバージョンであるため、コントローラーが原因でスコープに発生するさまざまなことをアサートできます。

これは、依存性注入の利点の 1 つです。

次のことが理にかなっている場合:

var scope = {};
scope.add = function(){};
expect(typeof scope.add).toBe('function');

次に、さらに一歩進んで、関数の追加を別の関数に移動しましょう。

var addFunctionToScope = function(scope) {
  scope.add = function(){};
};
var scope = {};
addFunctionToScope(scope);
expect(typeof scope.add).toBe('function');

ここで、関数をスコープに追加する新しい関数が、「addFunctionToScope」ではなく、実際には $controller と呼ばれているふりをします。

var scope = {};
$controller('SomeController', {$scope: scope});
expect(typeof scope.add).toBe('function');

{} で $rootScope.$new() を使用する理由

繰り返しますが、どちらでも使用できます。ただし、 、$on、、 などのスコープ固有の関数を使用する予定がある場合は、既存のスコープで $new 関数を使用して作成された実際のスコープ オブジェクトを注入する必要があります。$new$watch

ドキュメント

于 2016-01-05T21:40:16.330 に答える