>我正在测试"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
}));