2017-02-07 4 views
0

jasmineのspyOn関数を使用して、$ scope。$ broadcastが呼び出されたかどうかを判断しようとしています。

girlnames.spec.js -theコントローラ

describe('Girl names controller', function() { 
    var vm, 
     $scope; 

    beforeEach(module('nameStats')); 

    beforeEach(inject(function($controller, $rootScope, $q, _$httpBackend_, _namesService_) { 
     vm = $controller('girlNames', { 
      $scope: $rootScope.$new() 
     }); 

     $scope = $rootScope.$new() 

    })); 


    it('addPersonManually should trigger $scope.$broadcast', function() { 
     spyOn($scope, '$broadcast').and.callThrough() 
     vm.addPersonManually(p) 
     $scope.$digest(); 
     expect($scope.$broadcast).toHaveBeenCalled() 
    }); 

}); 

girlnames.js - コントローラ

"use strict"; 

    angular.module('nameStats').controller('girlNames', girlNames); 

    girlNames.$inject = ['$scope', 'namesService']; 

    function girlNames($scope, namesService) { 
     var vm = this; 

     vm.addPersonManually = addPersonManually; 

     function addPersonManually(person) { 
      $scope.$broadcast('personSelected', person); 

     } 
} 

コンソールに出力:

Expected spy $broadcast to have been called. 

答えて

1

テイクもっと見るあなたのコントローラーをインスタンス化している方法

beforeEach(inject(function($controller, $rootScope, $q, _$httpBackend_, _namesService_) { 
    vm = $controller('girlNames', { 
     $scope: $rootScope.$new() 
    }); 

    $scope = $rootScope.$new(); 
})); 

1つのスコープインスタンスを挿入し、テスト用に全く異なるものを使用します。

あなたのコードは、この

beforeEach(inject(function($controller, $rootScope) { 
    $scope = $rootScope.$new(); 

    vm = $controller('girlNames', { 
     $scope: $scope 
    }); 
})); 

高度な先端のようになります

は、あなたのテストでローカル変数を取り除くことを検討してください。 Karmaはすべてのテストスーツを参照して、すべてのテストスーツが実行され、メモリ消費量が膨大になる。十分なテストがあればプロセスが失敗することさえあります(私たちのケースでは数千人でした)。 Useful article

使用this代わり

beforeEach(inject(function($controller, $rootScope) { 
    this.$scope = $rootScope.$new(); 

    this.ctrl = $controller('girlNames', { 
     $scope: $scope 
    }); 
})); 

it('addPersonManually should trigger $scope.$broadcast', function() { 
    spyOn(this.$scope, '$broadcast').and.callThrough() 
    this.ctrl.addPersonManually(p) 
    this.$scope.$digest(); 
    expect(this.$scope.$broadcast).toHaveBeenCalled() 
}); 
+0

は、そのような簡単な解決策をありがとう:) – Joel

+0

は、その後、TY、それを受け入れる@Joel :) –

関連する問題