代码之家  ›  专栏  ›  技术社区  ›  Andresch Serj

karma:监听angular ui路由器事件的单元测试控制器

  •  2
  • Andresch Serj  · 技术社区  · 10 年前

    我尝试用Kara/Sinon/Jastine对angularJS控制器进行单元测试。 控制器监听来自angular ui路由器的状态变化以调用服务。

    我拒绝了服务方法( 使现代化 )使用sinon和我使用$broadcast将事件放入测试中。 我使用$apply启动事件。

    然而,控制器似乎没有反应。

    我试着检查一下这个方法,我也使用console.log查看控制器是否有反应,但它没有。 它在手动浏览器测试中是这样的,所以我想是我的测试需要修复( 我知道应该反过来 ).

    我在这里做错了什么?

    业力测试规范:

    'use strict';    
    describe('controllers', function() {
        beforeEach(module('myApp.controllers'));
        beforeEach(module('myApp.services'));
        beforeEach(module('ui.router'));
    
        describe('myAppController', function() {
            var scope, ctrl;
    
            beforeEach(inject(function(
                $rootScope, $controller, $injector,ParamsHelper) {
    
                scope = $rootScope.$new();
                scope.ParamsHelperStub  = sinon.stub(ParamsHelper, 'update');
    
                ctrl = $controller('myAppController', {
                    $scope: scope,
                    ParamsHelper: scope.ParamsHelperStub
                });
    
    
            }));
    
            it('should use ParamsHelper if is deepLink', function() {
                var event       = {};
                var toState     = {name:'regions'};
                var toParams    = ['test'];
                scope.AppSettingsStub.state.isDeepLink = true;
                scope.$broadcast("$stateChangeStart", event, toState, toParams);
                scope.$apply();
    
                expect(scope.ParamsHelperStub.calledWith(['test'])).toBeTruthy();
            });
    
        });
    });
    

    从控制器:

    ...
    
    rootScope.$on('$stateChangeStart',
      function(event, toState, toParams) {
        console.log('VibeController: $stateChangeStart Event catched');
        ParamsHelper.update(toParams);
    
        ...
    
    1 回复  |  直到 10 年前
        1
  •  3
  •   Andresch Serj    10 年前

    问题在范围内。 要激发控制器可以识别的事件,我需要在rootScope上下文中激发它。

    我在初始注入中添加了rootScope,然后相应地编辑了广播命令:

    describe('myAppController', function() {
      var scope, ctrl, rootScope;
    
      beforeEach(inject(function(
        $rootScope, $controller, $injector, ParamsHelper) {
    
        rootScope = $rootScope;
    
        ...
    
        rootCope.$broadcast("$stateChangeStart", event, toState, toParams);