gpt4 book ai didi

javascript - 如何测试使用 promise 的 Angular 工厂函数是否在 Jasmine 中抛出错误

转载 作者:行者123 更新时间:2023-11-29 21:39:45 25 4
gpt4 key购买 nike

这是我的函数的样子。

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');
})
}

我需要函数以这种方式处理此函数内部的错误,然后抛出错误以在更高级别处理。但我不知道如何用 Jasmine 测试它。我知道如何控制测试 promise ,我的基本设置如下所示:

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();

}));

很明显,错误并没有被jasmine发现。那么在这种情况下如何测试抛出的错误

最佳答案

$q 不适用于原生 throw,您应该使用 $q API 在 promise 中重新抛出或创建新错误链。阅读有关它的一些问答:

解决方案是使用 return $q.reject('Error in my function') 而不是 throw new Error('Error in my function'); .

但悬而未决的问题是如何测试它。基本上你可以利用 promise 链并在测试中添加一个 .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 文件)

关于javascript - 如何测试使用 promise 的 Angular 工厂函数是否在 Jasmine 中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com