这是我的功能如何。
var myFunc = function(){
return functionReturningaPromise()
.then(function(){
//success, doesn't matter what happens here
})
.catch(function(err){
//handle error here and then throw to handle higher
throw new Error('Error in my function');
})
}
我需要这个函数来处理这个函数内部的错误,然后抛出一个错误来处理更高级别的错误。但我不知道如何用茉莉花测试它。我知道如何控制测试的承诺,我的基本设置如下:
it('Should throw an error', inject(function(alert) {
var instance = instanceFactory.createInstance(someData);
var deferred = $q.defer();
spyOn(someFactory, 'someMethod').and.returnValue(deferred.promise);
//instance contains the throwing function above
instance.myFunc(otherData);
deferred.reject({data: '12 - error'});
$rootScope.$digest();
expect(instance.myFunc).toThrow();
}));
显然,茉莉花没有找到错误。那么如何在这种情况下测试错误抛出
答案 0 :(得分:2)
$q
无法与原生throw
一起使用,您应该使用$q
API在promise链中重新抛出或创建新错误。一些Q / A来阅读它:
解决方案是使用return $q.reject('Error in my function')
代替throw new Error('Error in my function');
。
但是开放的问题是如何测试它。基本上,您可以使用承诺链并在测试中添加一个.catch()
以检查错误,并且测试正在使用Jasmine Async API:
it('should throw an error', function (done) {
// ----- use Jasmine async API -------^^^
var instance = instanceFactory.createInstance(someData);
var deferred = $q.defer();
spyOn(someFactory, 'someMethod').and.returnValue(deferred.promise);
// here we continue catching and check the error
var promise = instance.myFunc(otherData);
promise.catch(function (err) {
expect(err).toBe('Error in my function');
done();
});
deferred.reject({data: '12 - error'});
$rootScope.$digest();
});
Here is a working sample(在侧栏中打开script.js
文件)