尝试用茉莉花坑测试时的笑话超时

时间:2015-03-05 09:16:24

标签: javascript angularjs jasmine jestjs

我正在尝试使用Jest针对角度UI运行一个小测试但是我在5秒后得到超时。 这是我的代码:

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;
   };
});

我正在使用pit所以我可以有1秒的延迟来允许angular更新视图,但似乎setTimeout中的匿名函数永远不会被调用。承诺没有得到满足,测试超时。由于Jest使用Jasmine 1.3.0,我也尝试使用runs()和waitsFor(),但我得到了相同的结果。

1 个答案:

答案 0 :(得分:2)

战斗这一点,但在我的情况下解决了它。关键问题是,除非您明确这样做,否则jest会劫持您的计时器并将它们放入一个永远不会运行的队列中。

尝试更改

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