-1
我正在测试'ServiceOne',它在第二个服务“ServiceTwo”中使用了一个名为“get”的方法。 'ServiceTwo'中的get()方法调用$http
,所以它会返回一个承诺,直到解析$http
调用。该“ServiceOne”的方法,我试图测试如下:AngularJS单元测试:模拟的承诺已解决,但方法仍然返回一个承诺?
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'。所以,我可以让我的测试通过,如果我进入了承诺目标,并寻找价值:
expect(retVal.$$state.value).toBe('95'); //passes
返回的承诺对象具有1的状态,所以我知道它已经解决了。并且promise的值是正确的,设置为'95',就好像我的then()函数内的逻辑已经被执行一样。为什么当我运行Karma时会收到此错误消息?
Expected Promise({ $$state: Object({ status: 1, value: '95' }) }) to be '95'.
这完美地工作,非常感谢你的帮助! – user3897392