gpt4 book ai didi

javascript - Angular - 使用 httpBackend 测试 http 服务会引发意外异常

转载 作者:行者123 更新时间:2023-11-27 23:09:53 25 4
gpt4 key购买 nike

模块定义

var module = angular.module('test', []);
module.provider('client', function() {
this.$get = function($http) {
return {
foo: function() {
return $http.get('foo');
}
}
}
});

module.factory('service', ['client', function(client) {
return {
bar: function() {
return client.foo();
}
}
}]);

基本上,客户端是 http 调用的包装器,服务是客户端基本功能的包装器。

我正在使用 karma+jasmine 对提供程序和服务进行单元测试。提供程序测试按预期运行,但我的服务测试有问题:

describe('service test', function(){
var service = null;
beforeEach(function(){
module('test')

inject(function(_service_, $httpBackend, $injector) {
service = _service_;
$httpBackend = $injector.get('$httpBackend');
});
});

it('should invoke client.foo via service.bar', function() {
$httpBackend.expect("GET", "foo");
service.bar();
expect($httpBackend.flush).not.toThrow();
});

});

我得到预期函数不会抛出,但它抛出了错误:没有待处理的刷新请求!。当用同样的方式测试提供者时,该测试通过了。为什么?

最佳答案

当您测试服务时,您需要模拟客户端并注入(inject)该模拟而不是真正的客户端。如果您只想使用它来测试此服务,则您的模拟可以位于同一个文件中;如果您将在其他地方再次使用它,则可以位于单独的文件中。以这种方式执行此操作不需要使用 $httpBackend (因为您实际上并未进行 http 调用),但确实需要使用范围来解析 promise 。

模拟客户端:

angular.module('mocks.clientMock', [])
.factory('client', ['$q', function($q) {
var mock = {
foo: function() {
var defOjb = $q.defer();
defOjb.resolve({'your data':'1a'});
return defOjb.promise;
}
};
return mock;
}]);

使用模拟:

describe('service test', function(){
var service, mock, scope;
beforeEach(function(){
module('test', 'mocks.clientMock');

inject(function(_service_, $rootScope) {
service = _service_;
scope = $rootScope.$new();
});
});

it('should invoke client.foo via service.bar', function() {
spyOn(client, 'foo').and.callThrough();
service.bar();
scope.$digest();
expect(client.foo).toHaveBeenCalled();
});
});

关于javascript - Angular - 使用 httpBackend 测试 http 服务会引发意外异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290141/

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