我试图围绕我的角度项目建立一些茉莉花单元测试。我遇到了一种情况,我不确定如何最好地解决这个问题。
如果确定错误是401错误,我使用能够重试请求的响应拦截器。它会调用更新授权令牌,然后透明地重新发出请求。
(原始电话) - > 401? (重新接收并重试):(返回失败)
我的问题在于:
$httpBackend.whenPOST('/mymockedendpoint').respond(401, null);
这是我想要第一次查询的行为。但是,因为它还控制所有后续查询,我的令牌续订工作,然后它重新发出此请求,但它不像生产中那样返回200,它仍然返回401。
如何扩展whenPOST
的处理,以便我可以控制某种处理程序中的行为?这甚至可能吗?
现在执行我的测试会产生一个无限循环,因为它们重新发出请求(因为它成功更新了令牌)并再次捕获,因为将要200个请求返回401)。
答案 0 :(得分:3)
您可以使用“expect”版本,而不是使用$httpBackend
的基于“when”的函数。这将允许您声明特定请求是按特定顺序进行的。 documentation for $httpBackend很好地描述了差异:
$ httpBackend.expect - 指定请求期望
$ httpBackend.when - 指定后端定义
请求预期与后端定义
请求期望提供了一种方式 对应用程序发出的请求进行断言 定义这些请求的响应。如果是,测试将失败 没有提出预期的请求,或者订单的顺序错误。
后端定义允许您为您的后端定义假后端 如果提出特定请求或不提出声明的应用程序 不是,如果提出请求,它只返回训练有素的响应。考试 无论是否在测试期间提出请求,都会通过。
鉴于此,请在测试中尝试:
$httpBackend.expectPOST('/mymockedendpoint').respond(401, null);
$httpBackend.expectPOST('/mymockedendpoint').respond(200, { });
$httpBackend.flush();
另外,请注意函数$httpBackend.resetExpectations()
,它可能在这种情况下很有用。