2016-02-02 137 views
-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'. 

回答

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

这完美地工作,非常感谢你的帮助! – user3897392