AngularJS单元测试:模拟承诺已解决,但方法仍返回承诺



>我正在测试"ServiceOne",它在第二个服务"ServiceTwo"中使用了一个名为"get"的方法。 "ServiceTwo"中的get((方法进行$http调用,因此它会返回一个承诺,直到$http调用被解析。 我尝试测试的"ServiceOne"方法如下所示:

serviceOne.getNewId = function (oldId) {
    var url = "http://mock.com";
    return serviceTwo.get(url).then(function (returned) {
        if (returned.data !== undefined) {
            return returned.data[0].newId;
        } else {
            return oldId;
        }
    });
};

以下是我在ServiceOne中对getNewId()的测试:

beforeEach(angular.mock.inject(function (_serviceOne_,_$q_, _$rootScope_, _serviceTwo_) {
    serviceOne = _serviceOne_;
    serviceTwo = _serviceTwo_;
    $rootScope = _$rootScope_;
    deferred = _$q_.defer();
}));
it('should return a newId', inject(function (serviceTwo) {        
    spyOn(serviceTwo, 'get').and.returnValue(deferred.promise);
    var returnedData = {data:[{newId: '95'}]};
    deferred.resolve(returnedData);
    var retVal = serviceOne.getNewId('322');       
    $rootScope.$apply();
    expect(retVal).toBe('95');  //fails
}));

retVal作为承诺对象返回,而不是预期的字符串"95"。 因此,如果我进入 promise 对象并查找值,我可以让我的测试通过:

expect(retVal.$$state.value).toBe('95');  //passes

返回的承诺对象的状态为 1,所以我知道它已解决。 并且 promise 的值是正确的,设置为 '95',就好像我的 then(( 函数中的逻辑已被执行一样。 为什么我在运行 Karma 时收到此错误消息?

Expected Promise({ $$state: Object({ status: 1, value: '95' }) }) to be '95'.

因此,对于承诺,它们不返回值,它们返回一个承诺,因此您必须像这样重组测试:

it('should return a newId', inject(function (serviceTwo) {        
    spyOn(serviceTwo, 'get').and.returnValue(deferred.promise);
    var returnedData = {data:[{newId: '95'}]};
    var retVal;
    serviceOne.getNewId('322')
        .then(function(result){
            retVal = result;
        });
    deferred.resolve(returnedData);
    $rootScope.$apply();
    expect(retVal).toBe('95');  //should pass
}));

最新更新