我在工厂中有以下代码:
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!';
});
}
};
});
以及以下 Jasmine 测试:
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()
方法的函数是否返回“”我访问了谷歌!”?
这是此代码的一个plunkr:http://plnkr.co/edit/DrKGV11eTpi2CrtYtffp
最佳答案
您快完成了,您只需要做几件事。
- 在 apiFactory.call 方法中,您应该返回 $http.get()。这将向调用者返回 promise 。
- 您需要添加某种检查以验证结果是否从 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!';
});
这应该适合你!
关于javascript - 我如何使用 Jasmine 测试 AngularJS promise 返回的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27445513/