gpt4 book ai didi

javascript - 我如何使用 Jasmine 测试 AngularJS promise 返回的内容?

转载 作者:行者123 更新时间:2023-11-30 00:35:21 25 4
gpt4 key购买 nike

我在工厂中有以下代码:

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

最佳答案

您快完成了,您只需要做几件事。

  1. 在 apiFactory.call 方法中,您应该返回 $http.get()。这将向调用者返回 promise 。
  2. 您需要添加某种检查以验证结果是否从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com