AngularJS $超时功能没有在我的Jasmine规范中执行

Esa*_*ola 37 jasmine angularjs

我正在尝试用Jasma测试我的AngularJS控制器,使用Karma.但是$timeout在现实生活中运作良好的一个,会使我的测试崩溃.

控制器:

var Ctrl = function($scope, $timeout) {
  $scope.doStuff = function() {
    $timeout(function() {
      $scope.stuffDone = true;
    }, 250);
  };
};
Run Code Online (Sandbox Code Playgroud)

Jasmine它阻塞(在哪里$scope和控制器已正确初始化):

it('should do stuff', function() {
  runs(function() {
    $scope.doStuff();
  });
  waitsFor(function() { 
    return $scope.stuffDone; 
  }, 'Stuff should be done', 750);
  runs(function() {
    expect($scope.stuffDone).toBeTruthy();
  });
});
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中运行我的应用程序时,$timeout将执行函数并且$scope.stuffDone将为true.但在我的测试中,$timeout什么都不做,该函数永远不会被执行,并且Jasmine在超时750 ms后报告错误.这可能有什么问题?

rtc*_*rry 80

根据$ timeout的Angular JS文档,您可以使用$timeout.flush()同步刷新延迟函数的队列.

尝试将测试更新为:

it('should do stuff', function() {
  expect($scope.stuffDone).toBeFalsy();
  $scope.doStuff();
  expect($scope.stuffDone).toBeFalsy();
  $timeout.flush();
  expect($scope.stuffDone).toBeTruthy();
});
Run Code Online (Sandbox Code Playgroud)

这是一个探测器,显示您的原始测试失败和新测试通过.

  • 所以那些Github链接指的是master并且不再有用.以下是针对那些好奇的版本的相同链接:[here](https://github.com/angular/angular.js/blob/v1.1.5/src/ngMock/angular-mocks.js#L648)和[这里](https://github.com/angular/angular.js/blob/v1.1.5/src/ngMock/angular-mocks.js#L1466) (3认同)

sto*_*ben 10

正如其中一条评论所述,Jasmine setTimeoutmock未被使用,因为使用了角度的JS模拟$timeout服务.就个人而言,我宁愿使用Jasmine,因为它的模拟方法让我测试超时的长度.您可以使用单元测试中的简单提供程序有效地绕过它:

module(function($provide) {
  $provide.constant('$timeout', setTimeout);
});
Run Code Online (Sandbox Code Playgroud)

注意:如果你走这条路线,一定要$scope.apply()在jasmine.Clock.tick之后调用.