AngularJS/Karma-测试函数返回已解决或拒绝的promise

AngularJS/Karma - Testing function returns promise that has been resolved or rejected

本文关键字:解决 拒绝 promise 返回 Karma- 测试 函数 AngularJS      更新时间:2023-09-26

如果我的函数返回了一个被拒绝的承诺,但似乎没有发现任何令人惊讶的事情,那么尝试使用AngularMock在Karma中进行单元测试。

我有一个类似UserService的服务,它有一个函数:processIdentityResponse,它返回一个promise,该promise要么被解析,要么被拒绝,这取决于里面的逻辑:

processIdentityResponse: function(response)
{
    var deferred = $q.defer();
    if (response.data.banned) {
        deferred.reject(response);
    } else {
        deferred.resolve(response);
    }   
    return deferred.promise;
}

我想测试一下,如果被禁止的财产存在,那么被拒绝的承诺就会被返回,如果不存在,它就会被解决。。。我怎样才能做到这一点?

我尝试了以下方法,但没有成功:

it('should return a rejected promise if status is a string', function() {
    var rejected = false;
    UserService.processIdentityResponse(data).catch(function() {
        rejected = true;
    });
    expect(rejected).toBe(true);
});

原因似乎是由于promise是异步功能,所以尚未解决。

你基本上必须像这样$rootScope.$digest()之后:

it('should return a rejected promise if status is a string', inject(function($rootScope) {
    var rejected = false;
    UserService.processIdentityResponse(data).catch(function() {
        rejected = true;
    });
    $rootScope.$digest();
    expect(rejected).toBe(true);
}));

为了补充Dominic所说的内容,我使用了Jasimine done()异步支持功能。把它想象成一个暂停/等待功能。

describe('my description',function(){
 beforeEach(function(done){
  var rejected = true;
  var promise = UserService.processIdentityResponse(data);//add ur service or function that will return a promise here
  setTimeout(function(){done();},1500);//set time to 1500ms or more if it's a long request
 });
 it('it should be true',function(done){
  promise.catch(function(){ rejected=true});
  $rootScope.$digest();//important
  expect(rejected).toBeTruthy();
  done();
 });
});