Javascript 如何使用Jasmine测试AngularJS承诺返回的内容?
我在工厂中有以下代码:Javascript 如何使用Jasmine测试AngularJS承诺返回的内容?,javascript,angularjs,jasmine,promise,Javascript,Angularjs,Jasmine,Promise,我在工厂中有以下代码: 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!'; }); } }; });
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承诺已被调用,但如何测试传递给then()
方法的函数是否返回“”我访问了Google!“
这段代码有一个提示:你就快到了,你只需要做几件事
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!';
});
这应该对你有用!对,你只需调用返回的承诺上的
then()
方法(顺便说一句,我忘了在我的示例中添加返回,但我的代码中有它)并检查调用它的参数。我应该想到这一点!非常感谢,回答得很好!