2013-12-03 2 views
6

Я пытаюсь шпионить за $ timeout, чтобы я мог убедиться, что он не был вызван. В частности, мой код продукции (см ниже) вызывает $ таймаут как функцию, а не объект:Как вы смотрите на тайм-аут AngularJS с Жасмин?

$timeout(function() { ... }) 

и не

$timeout.cancel() // for instance 

Жасмин, однако, требует объект, который будет шпионить, как это :

spyOn(someObject, '$timeout') 

Я не знаю, какой был бы «некоторый объект».

Я использую Угловые издевки, если это имеет значение.

Edit: Соответствующий код продукции Пытаюсь тест выглядит следующим образом:

EventHandler.prototype._updateDurationInOneSecondOn = function (call) { 
    var _this = this; 
    var _updateDurationPromise = this._$timeout(function() { 
      call.duration = new Date().getTime() - call.startTime; 
      _this._updateDurationInOneSecondOn(call); 
     }, 1000); 
    // ... more irrelevant code 
} 

В конкретном сценарии тестирования я пытаюсь утверждать, что $ таймаут никогда не называли.

Редактировать 2: Четко указано, что я использую $ timeout как функцию, а не объект.

+0

Вы можете разместить пример кода, который вы тестируете? –

+0

@DavinTryon сделано –

ответ

1

В угловом $timeout это сервис, который выполняет/вызывает функцию. Запрос на «шпион» $timeout является немного странным, если он выполняет функцию Х в Y заданном времени. Что бы я сделал, чтобы шпионить эту услугу является функцией «фиктивного» тайм-аута и ввести его в контроллере что-то вроде:

it('shouldvalidate time',inject(function($window, $timeout){ 

     function timeout(fn, delay, invokeApply) { 
      console.log('spy timeout invocation here'); 
      $window.setTimeout(fn,delay); 
     } 

//instead of injecting $timeout in the controller you can inject the mock version timeout 
     createController(timeout); 

// inside your controller|service|directive everything stays the same 
/*  $timeout(function(){ 
      console.log('hello world'); 
      x = true; 
     },100); */ 
     var x = false; //some variable or action to wait for 

     waitsFor(function(){ 
      return x; 
     },"timeout",200); 

... 
+0

Я предполагаю, что это сработает. Тем не менее, я выбрал шпионаж на публичную функцию в моем контроллере, которая выполняется одновременно с вызовом $ timeout. Я сделал это, чтобы сделать тестовый код намного проще. –

+0

@YngvarKristiansen, что вы сказали, было вашим решением, не был вашим первоначальным вопросом. Вот как ваш тайм-аут шпиона. Я думаю, что это ответ на ваш вопрос. Вы согласны? – Dalorzo

+1

Вы правы, я помечаю решение как ответ. Я колебался, отмечая ответ как решение, потому что он использует макет, а не жасминовый шпион, как я надеялся, но это решение тем не менее. –

7

столкнулся с той же проблемой, и в конечном итоге украшение службы тайма-аута $ с шпиона.

beforeEach(module(function($provide) { 
    $provide.decorator('$timeout', function($delegate) { 
     return sinon.spy($delegate); 
    }); 
})); 

Написал больше о том, почему это работает here.

+0

Хорошее предложение. Я полагаю, что нужно заменить sinon.spy (...) на jasmine.createSpy ('$ timeout') (не уверен в том, что означает аргумент), хотя я не тестировал это. –

+0

Да, вы должны иметь возможность сказать return jasmine.createSpy ($ delegate). В этом случае $ delegate является исходной функцией $ timeout. –

+0

Ничего, я пришел к аналогичному выводу, пытаясь проверить код, очень похожий на ваш прецедент. Хотя, я хотел, чтобы функции ngMock, примененные к $ timeout, все еще существовали, что было довольно просто сделать. Я отредактирую ваш пост и поставлю то, что я сделал. – JDWardle

0

Этот код работает для меня

var element, scope, rootScope, mock = { 
    timeout : function(callback, lapse){ 
     setTimeout(callback, lapse); 
    } 
}; 

beforeEach(module(function($provide) { 
    $provide.decorator('$timeout', function($delegate) { 
     return function(callback, lapse){ 
      mock.timeout(callback, lapse); 
      return $delegate.apply(this, arguments); 
     }; 
    }); 
})); 
describe("when showing alert message", function(){ 

    it("should be able to show message", function(){ 
     rootScope.modalHtml = undefined; 
     spyOn(mock, 'timeout').and.callFake(function(callback){ 
      callback(); 
     }); 
     rootScope.showMessage('SAMPLE'); 

     expect(rootScope.modalHtml).toBe('SAMPLE'); 

    }); 

}); 
Смежные вопросы