如何测试使用promise的角度工厂函数是否在jasmine中引发错误

时间:2015-11-01 21:32:23

标签: javascript angularjs jasmine promise

这是我的功能如何。

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

}));

显然,茉莉花没有找到错误。那么如何在这种情况下测试错误抛出

1 个答案:

答案 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文件)