AngularJS单元测试:模拟的承诺已经解决,但方法仍然会返回一个承诺?

时间:2016-02-02 19:01:05

标签: angularjs karma-jasmine angular-promise

我正在测试'ServiceOne',它在第二个服务'ServiceTwo'中使用一个名为“get”的方法。 'ServiceTwo'中的get()方法进行$http调用,因此它会在$http调用解析之前返回一个promise。我正在尝试测试的'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作为promise对象返回,而不是预期的字符串'95'。所以,如果我进入promise对象并查找值,我可以通过测试:

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

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

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

1 个答案:

答案 0 :(得分:1)

因此,如果承诺他们没有返回价值,他们会返回一个承诺,所以你必须重新构建你的测试:

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