gpt4 book ai didi

angularjs - 如果 GET 请求被缓存,$httpBackend.flush() 会抛出错误

转载 作者:行者123 更新时间:2023-12-01 06:28:00 26 4
gpt4 key购买 nike

我正在尝试测试我的服务是否使用缓存的 GET 请求。

测试的简化版本:

  var url = "/test";
var whenTestRequest = $httpBackend.when('GET', url);

whenTestRequest.respond(200, "r1");
$http({ url: url, method: 'GET', cache: true }).success(function (value) {
expect(value).toBe("r1");
});
$httpBackend.flush();

whenTestRequest.respond(200, "r2");
$http({ url: url, method: 'GET', cache: true }).success(function (value) {
expect(value).toBe("r1");
});
$httpBackend.flush();

我需要第二个 $httpBackend.flush()这样我的第二个 success函数被调用,但第二次调用 flush抛出:

Error: No pending request to flush !



所以我需要包装 flushtry/ catch .那行得通,但是有没有正确的方法来处理这个问题?

最佳答案

我想我找到了解决方案 - 而不是调用 $httpBackend.flush() , 调用$rootScope.$digest() .这就是 flush最终在后台执行,除了不检查是否有任何未决的请求,它会导致缓存满足的 $http 请求的 promise 得到解决。

当我切换我的一个项目以将指令模板存储在模板缓存中而不是为每个模板执行 http 请求时,我遇到了这个问题。我的旧测试创建了这样的指令:

beforeEach(inject(function($compile, $rootScope, $httpBackend) {
$httpBackend.expectGET('login.html').respond('<div></div>');
$compile('<login-page/>')($rootScope);
$httpBackend.flush();
}));

但是,当我切换测试以使用模板时,刷新抛出了该异常,因为缓存满足了请求并且从未在虚拟线路上进行。但是即使删除了 $httpBackend 的东西,指令仍然没有建立,因为 templateUrl导致整个指令初始化进程位于 then调用模板请求的 promise 。即使缓存会满足模板请求,代码仍然大部分通过 $http调用,但由于请求不会在 $httpBackend 的缓存中结束预计,没有一种明显的方法可以让 Promise 链真正运行。

经过一番调查和测试,原来是 $rootScope.$digest()将导致 Promise 运行,因此将代码更改为:
beforeEach(inject(function($compile, $rootScope) {
$compile('<login-page/>')($rootScope);
$rootScope.$digest();
}));

这允许 beforeEach运行,并且该指令实际上已构建,允许其余测试正常继续。

关于angularjs - 如果 GET 请求被缓存,$httpBackend.flush() 会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26028405/

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