2015-03-05 2 views
1

Я пытаюсь использовать Jest для проведения небольшого теста против углового интерфейса, но я получаю таймаут через 5 секунд. Вот мой код:Jest таймауты при попытке тестирования с жасмин-ямой

jest.autoMockOff(); 

require('../../../../bower_components/angular/angular'); 
require('../../../../bower_components/angular-mocks/angular-mocks'); 

window.Event = {}; 

describe('about', function(){ 

    var mockScope; 

    pit('updates the view ', function(done){ 
     return runTest() 
     .then(function(){ 
      var $ = require('../../../../bower_components/jquery/dist/jquery'); 
      expect($("#about-div").text()).toEqual('fred'); 
     }); 
    }); 

    function runTest() { 
     var q = require('../../../../bower_components/q/q'); 
     var defer = q.defer(); 

     require('../../../../app/scripts/app'); 
     require('../../../../app/scripts/controllers/about'); 

     angular.mock.module('app'); 
     inject(function($rootScope, $controller){ 
      mockScope = $rootScope.$new(); 
      controller = $controller('aboutController', {$scope: mockScope}); 
     }); 

     document.body.innerHTML = 
      '<html>' + 
      ' <body>' + 
      '  <div ng-controller="aboutController">' + 
      '   <div id="about-div" >{{firstName}}</div>' + 
      '  </div>' + 
      ' </body>' + 
      '</html>'; 

     setTimeout(function() { defer.resolve(); }, 1000); 

     return defer.promise; 
    }; 
}); 

Я использую яму, так что я могу иметь 1 секундную задержку, чтобы позволить угловатым обновить представление, но, кажется, что анонимная функция в SetTimeout никогда не вызывается. Обещание не выполняется, и время проверки не соблюдается. Поскольку Jest использует Jasmine 1.3.0, я также пытался использовать run() и waitsFor(), но получаю тот же результат.

+0

Всегда тайм-аут, с бегами и waitsFor тоже. Всегда. Никаких исключений. (по вызовам AJAX) – gbbr

ответ

2

Борьба с этим тоже, но решила его в моем случае. Основная проблема заключается в том, что шутка захватывает ваши таймеры и помещает их в очередь, которая никогда не запускается, если вы явно не сделаете этого.

попробуйте изменить

return runTest() 
.then(.. 

в

queued = runTest(); // run it... jest will hijack your internal timer 
jest.runAllTimers(); // kick the timer to get it unstuck... 
return queued.then(... // return the promise, having forced the internal timers to run 

На самом деле, это не то, что эта команда (jest.runAllTimers) начнет таймеры, то, что он будет работать, что внутри таймера - так что вы пропустите ожидание, которое может быть приятным для того, чтобы ваши тесты выполнялись быстрее.

полезный фон можно найти здесь: https://facebook.github.io/jest/docs/timer-mocks.html#content

и здесь: https://facebook.github.io/jest/docs/api.html#jest-runalltimers

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