我正在测试'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'.
答案 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
}));