我在工厂中有以下代码:
var app = angular.module('plunker', []);
app.factory('apiFactory', function($http) {
return {
'call':function(){
$http.get('http://www.google.com').then(function(){
return 'I visited Google!';
});
}
};
});
以及以下茉莉花测试:
describe('Testing apiFactory', function() {
var $scope,
apiFactory,
$http,
$q,
rootScope;
beforeEach(module('plunker'));
beforeEach(inject(function($rootScope, _apiFactory_, _$http_, _$q_, _$rootScope_) {
apiFactory = _apiFactory_;
$http = _$http_;
$q = _$q_;
rootScope = _$rootScope_;
}));
it('should return "I visited Google!"', function(){
var deferred = $q.defer();
spyOn($http, 'get').and.returnValue(deferred.promise);
deferred.resolve();
apiFactory.call();
rootScope.$apply();
expect($http.get).toHaveBeenCalledWith('http://www.google.com');
});
});
如您在上面看到的,我知道如何测试$ http.get promise已被调用,但是如何测试传递给
then()
方法的函数返回““我访问了Google!”?这是此代码的代码:http://plnkr.co/edit/DrKGV11eTpi2CrtYtffp
最佳答案:
您快要准备好了,您只需要做几件事。
在apiFactory.call方法中,您应该返回$ http.get()。这将向呼叫者返回承诺。
您需要添加某种检查,以验证是否从apiFactory.call方法返回了结果。
我将您的测试修改为如下所示:
it('should return "I visited Google!', function(){
var deferred = $q.defer();
var result;
spyOn($http, 'get').and.returnValue(deferred.promise);
deferred.resolve();
apiFactory.call().then(function(resolved) {
result = resolved;
});
expect($http.get).toHaveBeenCalledWith('http://www.google.com');
expect(result).toBeUndefined();
rootScope.$apply();
expect(result).toBe('I visited Google!');
});
为了澄清,您的
apiFactory.call
方法应类似于以下内容:return $http.get('http://www.google.com').then(function(){
return 'I visited Google!';
});
这应该为您工作!