2

私は基本的に以下のようなangularjsコントローラーを持っています

app.controller('MyCtrl', function($scope, service) {

  $scope.positions = service.loadPositions(); // this calls $http internally

  $scope.save = function() {
    ...
  };

  // other $scope functions here

});

$scope のいずれかのメソッドのテストを記述するたびに、service.loadPositions()以下のようにスタブする必要があります。

  it(should 'save modified position', function($controller, service, $rootScope) {
    spyOn(service, 'loadPositions').andReturn(fakeData);

    var scope = $rootScope.$new();
    $controller('MyCtrl', {$scope: scope});

    // test stuff here
  })

すべてのテストでこの最初のスタブを回避する方法はありますか? つまり、コントローラーの起動時にこのアクションが呼び出されることを既にテストした場合、次のすべてのテストでこれをスタブする必要はありません。これにより、各テストで多くの繰り返しが発生します。

編集

つまずいngInitたので使えると思ったのですが、こういう使い方はあまりおすすめできそうにないのですが、なぜだろう?

4

2 に答える 2

3

関数beforeEach内でa を使用します。describe

describe('My test', function() {
    var $controller,
        $rootScope,
        serviceMock;

    beforeEach(function() {
        serviceMock = { loadPositions: function() {} };
        spyOn(serviceMock, 'loadPositions').andReturn(fakeData);

        inject(_$controller_, _$rootScope_) {
            $rootScope = _$rootScope_.$new();
            $controller = _$controller_('MyCtrl', 
                {$scope: $rootScope, service: serviceMock});
        };
    });

    it('should save modified position', function() {       
        // test stuff here
    });
});

コントローラーの初期化beforeEachも同様に移動したことに注意してください。これにより、すべてのテストで再度行う必要がなくなります。

引数のアンダースコアが何のためにあるのか疑問に思っている場合に備えて、テストでローカル変数とローカル変数injectを宣言できるようにします。Angular は、関数の依存関係を解決するときにそれらを無視します。$controller$rootScope

更新: サンプル コードに小さなバグがありました。修正しました。

于 2013-08-09T11:50:52.120 に答える