Karma、Jasmine、および ngMock を使用して、Angular の単体テストを学習しようとしています。Angular のドキュメントには、コントローラーの単体テストの作成方法を示す場所が少なくとも 2 か所ありますが、それらがどのように動作しているかについていくつか質問があります。
コントローラーのドキュメントから、コントローラーのテストに関するセクション:
describe('myController function', function() {
describe('myController', function() {
var $scope;
beforeEach(module('myApp'));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
$controller('MyController', {$scope: $scope});
}));
it("...");
});
});
質問 1:これはほとんど理解できますが、よくわからないことがあります。「MyController」のインスタンスを取得していることは理解していますが、返されたものがどこにも保存または使用されていないように見えるので、正しいオブジェクト$controllerを取得するためにそのコントローラーを取得することしか考えられませんか? $scopeそれでも、どこにも変数に保存されていないように見えるので、これが舞台裏でどのように機能するかについて、まだ少し混乱しています。module()使用しているモジュールを宣言しているように見えますが、他の場所で保存または使用していないように見えるため、どのように機能するかについて同じ混乱がありました。手動で保存する必要がないように、モジュール/コントローラー/スコープをキャッシュする背後に何かがありますか?
Unit Testing docsの別の例を次に示します。
describe('PasswordController', function() {
beforeEach(module('app'));
var $controller;
beforeEach(inject(function(_$controller_){
// The injector unwraps the underscores (_) from around the parameter names when matching
$controller = _$controller_;
}));
describe('$scope.grade', function() {
it('sets the strength to "strong" if the password length is >8 chars', function() {
var $scope = {};
var controller = $controller('PasswordController', { $scope: $scope });
$scope.password = 'longerthaneightchars';
$scope.grade();
expect($scope.strength).toEqual('strong');
});
});
});
質問 2:ここのbeforeEach関数では、アンダースコアのラッピングを行っています。それは、サービス名を変更せずにずっと同じサービス名を維持できるようにするためですか?
質問 3:次に、it()ブロック$controllerはその処理を実行します。今回は、返されたものを保存しますが、 var controller この時点以降はまだ使用していないようです。では、なぜそれを変数に保存するのでしょうか? it()私が思いつく唯一のことは、このブロック内で再び使用する必要がある場合に備えて保存することですが、この例ではそうではありませんでしたか?
私は良い説明を探していましたが、見つけられないようです。ばかげた説明が抜けていたら申し訳ありませんが、私は時間に追われており、これ以上車輪を回転させることに時間を費やすことができません。