gpt4 book ai didi

javascript - $httpBackend.flush 在服务抛出错误时失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:29:45 27 4
gpt4 key购买 nike

我已经创建了一个服务作为我的后端 API 的客户端。当后端返回错误时,我的服务应该通过使用更易读的消息重新抛出错误来处理该问题,以便稍后在 Controller 级别捕获:

function readApi() {
return $http.get("adress").catch(function (e) {
if (e.status === 400) {
throw new Error("API call not succeded...");
}
}).then(function (requestResult) {
// further processing of result
});
}

然后,我尝试在 Jasmine 中编写规范来测试此行为:

    it('throw proper error for 400 reponse from API', function () {
httpBackend.expectGET('address').respond(400, '');

expect(function () {
myService.readApi();
}).toThrow();

httpBackend.flush();
});

afterEach(function () {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});

不幸的是,错误似乎是从 httpBackend.flush() 而不是我的函数抛出的,导致测试失败。

是用错了还是 httpBackend mock 出错了?我怎样才能执行这样的测试?

编辑

我尝试了@tomepejo 的回答并且它几乎有效:

it('throw proper error for 400 reponse from API', function () {
httpBackend.expectGET('address').respond(400, '');

expect(function () {
myService.readApi();
httpBackend.flush();
}).toThrow();
});

afterEach(function () {
//httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});

不幸的是取消注释 afterEach 的主体会导致错误:

 Error: [$rootScope:inprog] $digest already in progress
http://errors.angularjs.org/1.3.14/$rootScope/inprog?p0=%24digest
at .../Scripts/Lib/angular.js:63:12
at beginPhase (.../Scripts/Lib/angular.js:14755:15)
at Scope.$digest (.../Scripts/Lib/angular.js:14197:9)
at Function.$httpBackend.verifyNoOutstandingExpectation (.../Scripts/Lib/angular-mocks.js:1550:38)
at Object.<anonymous> (.../ApiClientTest.js:94:29)

我认为无需提及,这个 afterEach 在许多其他测试中很有用,并且在每个测试的末尾粘贴这些调用(或将异常测试提取到另一个描述)感觉不像是正确的 的方法。

或者它可能是 angular-mocks 库中的错误,我应该提交错误报告?

最佳答案

您可以通过将 false 传递给 verifyNoOutstandingExpectation() 函数来实现您想要的,但是为了不干扰其他测试的 $digest 循环,您可以执行以下操作:

var shouldDigest;
beforeEach(inject(function (...) {
//your initialization here

shouldDigest = true;
}));

afterEach(function () {
httpBackend.verifyNoOutstandingExpectation(shouldDigest);
httpBackend.verifyNoOutstandingRequest();
});

在这个测试中特别是:

it('throw proper error for 400 reponse from API', function () {
httpBackend.expectGET('address').respond(400, '');

expect(function () {
myService.readApi();
httpBackend.flush();
}).toThrow();
shouldDigest = false;
});

来源和解释在这里:http://nikas.praninskas.com/angular/2015/11/20/quickie-httpbackend-digest-in-progress/

关于javascript - $httpBackend.flush 在服务抛出错误时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33737441/

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