【发布时间】:2016-06-30 11:04:07
【问题描述】:
我的组件中有这样的代码:
p.a().then(function(x) {
vm.x = x;
return p.b();
}).then(function(y) {
if (!y) {
return $q.reject(new Error('My Error'));
}
vm.y = y;
return y;
}).catch(function(error) {
log.error(error);
});
我可以很好地测试成功案例:
it('is successful', function(done) {
spyOn(p, 'a').and.returnValue($q.resolve('x'));
spyOn(p, 'b').and.returnValue($q.resolve('y'));
$ctrl = $componentController('myComponent', {
$scope: $rootScope.$new()
});
p.a().then(function() {
expect($ctrl.x).toEqual('x');
return p.b();
}).then(function() {
expect($ctrl.y).toEqual('y');
done();
});
$timeout.flush();
});
但我无法测试 catch 并断言错误:
it('fails', function(done) {
spyOn(p, 'a').and.returnValue($q.resolve());
spyOn(p, 'b').and.returnValue($q.resolve());
$ctrl = $componentController('myComponent', {
$scope: $rootScope.$new()
});
p.a().then(function() {
return p.b();
}).catch(function(error) {
expect(error).toEqual(new Error('My Error'));
done();
});
$timeout.flush();
});
我在运行测试时得到的只是:
错误:超时 - 未在超时内调用异步回调 由 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定。
这意味着catch 甚至没有运行(我尝试记录一些内容以仔细检查)。
任何想法我做错了什么?
【问题讨论】:
-
我不确定你想在这里做什么。你为什么不调用你的控制器上的任何函数
$ctrl?你在测试什么?测试中的代码? -
@Sonata,你是什么意思?我打电话给
p.a()和p.b()都返回承诺,在他们解决后我在控制器中设置了一些数据,这就是我正在测试的,vm === $ctrl
标签: javascript angularjs testing jasmine promise