AngularJS $timeout 函数未在我的 Jasmine 规范中执行

2024-01-18

我正在尝试使用 Karma 与 Jasmine 测试我的 AngularJS 控制器。但一个$timeout这在现实生活中运行良好,但却使我的测试崩溃。

控制器:

var Ctrl = function($scope, $timeout) {
  $scope.doStuff = function() {
    $timeout(function() {
      $scope.stuffDone = true;
    }, 250);
  };
};

茉莉花它块(其中$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();
  });
});

当我在浏览器中运行我的应用程序时,$timeout函数将被执行并且$scope.stuffDone将会是真的。但在我的测试中,$timeout不执行任何操作,该函数永远不会执行,并且 Jasmine 在超时 750 毫秒后报告错误。这里可能出了什么问题?


根据 Angular JS 文档$timeout http://docs.angularjs.org/api/ng.%24timeout, 您可以使用$timeout.flush()同步刷新延迟函数队列。

尝试将您的测试更新为:

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

这里有一个plunker http://embed.plnkr.co/exO5AESD6st4VaAVcfRH/preview显示您的原始测试失败和新测试通过。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS $timeout 函数未在我的 Jasmine 规范中执行 的相关文章

随机推荐