2014-10-12 2 views
0

С мокко и Жасмин, я пытаюсь модульного тестирования этой услуги:

angular.module("main.loadbalancer").run(function($rootScope, $state, DeviceVal) { 
    $rootScope.$on("$stateChangeStart", function(event, toState) { 
    var checkUrlDirectEdit, device; 
    device = window.location.hash.split("/")[2]; 
    checkUrlDirectEdit = function() { 
     return DeviceVal.previousDevice !== device && toState.name !== "main" && DeviceVal.lb.id === "undefined"; 
    }; 
    if (typeof DeviceVal.lb.id === "undefined" && toState.name !== "main" || checkUrlDirectEdit()) { 
     event.preventDefault(); 
     DeviceVal.previousDevice = device; 
     $state.transitionTo("main", {}, { 
     location: false 
     }); 
    } 
    if (DeviceVal.readonly && toState.name !== "main.loadbalancer.readonly") { 
     event.preventDefault(); 
     $state.transitionTo("main.loadbalancer.readonly", { 
     id: DeviceVal.lb.id 
     }, { 
     location: true, 
     reload: true 
     }); 
    } 
    return window.addEventListener("hashchange", function() { 
     return location.reload(); 
    }); 
    }); 
}); 

С помощью этого теста:

describe("health check service", function() { 
    var HealthCheckSvc; 
    HealthCheckSvc = null; 

    beforeEach(function() { 
    return module("main.loadbalancer"); 
    }); 

    beforeEach(inject(function($rootScope, _$state_, _DeviceVal_) { 
    this.$rootScope = $rootScope; 
    $state = _$state_; 
    $DeviceVal = _DeviceVal_; 

    spyOn($state, "transitionTo") 
    spyOn(this.$rootScope, "$on") 


    })); 

    it("do some junk", function() { 
     toState = 'main.loadbalancer.nodes'; 
     this.$rootScope.$broadcast("$stateChangeStart", "event", "toState"); 
     expect(this.$rootScope.$on).toHaveBeenCalledWith("$stateChangeStart"); 

    }); 
}); 

Прямо сейчас, у меня есть трудное время, делая ожидание для $rootScope.$on("$stateChangeStart"). Я думал spyOn(this.$rootScope, "$on") и expect(this.$rootScope.$on).toHaveBeenCalledWith("$stateChangeStart"); бы это сделать, но я получаю:

Expected spy $on to have been called with [ '$stateChangeStart' ] but it was never called. 
     Error: Expected spy $on to have been called with [ '$stateChangeStart' ] but it was never called. 

ответ

2

$rootScope.$on("$stateChangeStart" называется рано и просто для регистрации прослушивателя события.

Когда вы звоните this.$rootScope.$broadcast("$stateChangeStart", "event", "toState");, $rootScope.$on не называется, но код внутри обработчика (function(event, toState) {)

+0

Итак, я просто игнорирую '$ rootScope. $ On' и проверяю обработчик? Не следует ли проверять '$ rootScope. $ On' запускается с' spyOn' и 'expect'? – dman

+1

@ dman: Я не знаю, в чем ваш тестовый пример. Но с трансляцией вы должны проверить свой обработчик. '$ rootScope. $ on'' '' не срабатывает, поскольку он используется только для регистрации обработчика событий. –

+0

при тестировании этого обработчика, я проверяю инструкции if или только то, что результат будет с 'expect ($ state.transitionTo) ...'? – dman

1

Это возможно, но я подозреваю, что шпион добавляется после того, как run блок бежится. Способ вокруг этого состоит в том, чтобы предоставить вашему собственному макету $rootScope объект с функцией заглушки/шпионажа $on, к системе впрыскивания зависимостей, которую вы можете сделать до запуска run.

describe('run block', function() { 
    var $rootScope = null; 

    beforeEach(module('plunker')); 

    beforeEach(module(function($provide) { 
    $provide.value('$rootScope', { 
     '$on': jasmine.createSpy('$on') 
    }); 
    })); 

    beforeEach(inject(function(_$rootScope_) { 
    $rootScope = _$rootScope_; 
    })); 

    it('should call $on with $stateChangeStart and a function', function() { 
    expect($rootScope.$on).toHaveBeenCalledWith('$stateChangeStart', jasmine.any(Function)); 
    }); 
}); 

Это можно увидеть, работающих на http://plnkr.co/edit/XovukFUxOY479muQu4WW


Боковая панель: Я не уверен, нужен ли вам этот тест. Я думаю, что более важно убедиться, что он делает то, что он должен делать, когда происходит пожар.

Смежные вопросы