我使用茉莉花的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.发布于 2017-02-07 14:00:28
仔细观察一下您实例化控制器的方式。
beforeEach(inject(function($controller, $rootScope, $q, _$httpBackend_, _namesService_) {
vm = $controller('girlNames', {
$scope: $rootScope.$new()
});
$scope = $rootScope.$new();
}));您可以插入一个作用域实例,并使用一个完全不同的实例进行测试。
您的代码应该如下所示
beforeEach(inject(function($controller, $rootScope) {
$scope = $rootScope.$new();
vm = $controller('girlNames', {
$scope: $scope
});
}));高级提示
考虑在测试中去掉局部变量。Karma保留对所有测试的引用,直到它们全部运行完毕,从而导致巨大的内存消耗。它甚至可能导致进程失败,如果您有足够的测试(在我们的例子中是几千个)。有用物品。
使用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()
});https://stackoverflow.com/questions/42091186
复制相似问题