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)
这是一个探测器,显示您的原始测试失败和新测试通过.
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之后调用.
| 归档时间: |
|
| 查看次数: |
17721 次 |
| 最近记录: |