2015-08-17 2 views
1

Ошибка при тестировании функции, называемой $ интервалом.

В двух словах:

angular.module('services', []) 
    .factory('someFactory', [function() { 
    function someFunction() { console.log('someFunction called'); } 
    $interval(someFunction, 100); 

    return { 
     someFunction: someFunction 
    } 
    }]); 

describe('someFactory', function() { 
    it('should call someFunction', function() { 
    spyOn(someFactory, 'someFunction'); 
    $interval.flush(150); 
    // someFactory.someFunction() // will pass when uncommented 
    expect(someFactory.someFunction).toHaveBeenCalled(); // FAIL 
); 
}); 

В обоих случаях «SomeFunction называется» вошел в консоль, так что промывка вызова функции, но шпион не может видеть его, когда функция применяется $ interval.

Угловая 1,2 и Жасмин 1,3

Спасибо!

+0

Можете ли вы добавить какой-либо относящийся к каждому из них код установки выше? Похож на проблему с объемом/инъекцией, но не может сказать только что выше. Если вы закомментируете линию флеша, консоль все еще показывает строку журнала? – ktharsis

+0

См: http://plnkr.co/edit/7DAQuShNNSWEe9BWe1vQ?p=info С благодарностью полезным человеком в IRC канал – Caspar

+0

обновленный plunker: http://plnkr.co/edit/84HCKOA0Sfyb9SKXAUnk – Caspar

ответ

0

someFunction Вы следите за тем, который возвращается в объекте буквальным. someFunction, называемый $ interval, является частной функцией, объявленной на заводе. Вы можете сделать что-то вроде $interval(this.someFunction, 100);, чтобы заставить его работать.

На стороне примечания, в примере в плунжере обновления, кажется, что вы тестируете взаимодействие между методами одного и того же класса (насмехается над некоторыми функциями). IMO, поскольку объем модульного теста является классом, вы не должны издеваться над функциями этого класса. Вы должны проверить выход или побочный эффект вызова метода, например. в примере выше проверьте, что console.log был вызван через 100 мс, но не был вызван этот $ interval.

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