首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在$scope.$broadcast上使用Jasmnie的$scope.$broadcast

在$scope.$broadcast上使用Jasmnie的$scope.$broadcast
EN

Stack Overflow用户
提问于 2017-02-07 13:33:15
回答 1查看 560关注 0票数 1

我使用茉莉花的spyOn函数来确定是否调用了$scope.$broadcast。

girlnames.spec.js -the控制器

代码语言:javascript
复制
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 -控制器

代码语言:javascript
复制
    "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);

        }
}   

控制台中的输出:

代码语言:javascript
复制
Expected spy $broadcast to have been called.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-07 14:00:28

仔细观察一下您实例化控制器的方式。

代码语言:javascript
复制
beforeEach(inject(function($controller, $rootScope, $q, _$httpBackend_, _namesService_) {
    vm = $controller('girlNames', {
        $scope: $rootScope.$new()
    });

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

您可以插入一个作用域实例,并使用一个完全不同的实例进行测试。

您的代码应该如下所示

代码语言:javascript
复制
beforeEach(inject(function($controller, $rootScope) {
    $scope = $rootScope.$new();

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

高级提示

考虑在测试中去掉局部变量。Karma保留对所有测试的引用,直到它们全部运行完毕,从而导致巨大的内存消耗。它甚至可能导致进程失败,如果您有足够的测试(在我们的例子中是几千个)。有用物品

使用this代替

代码语言:javascript
复制
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()
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42091186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档