控制$ httpBackend.when()中每个catch的处理方式

时间:2014-08-07 00:59:50

标签: angularjs unit-testing jasmine

我试图围绕我的角度项目建立一些茉莉花单元测试。我遇到了一种情况,我不确定如何最好地解决这个问题。

如果确定错误是401错误,我使用能够重试请求的响应拦截器。它会调用更新授权令牌,然后透明地重新发出请求。

(原始电话) - > 401? (重新接收并重试):(返回失败)

我的问题在于:

$httpBackend.whenPOST('/mymockedendpoint').respond(401, null);

这是我想要第一次查询的行为。但是,因为它还控制所有后续查询,我的令牌续订工作,然后它重新发出此请求,但它不像生产中那样返回200,它仍然返回401。

如何扩展whenPOST的处理,以便我可以控制某种处理程序中的行为?这甚至可能吗?

现在执行我的测试会产生一个无限循环,因为它们重新发出请求(因为它成功更新了令牌)并再次捕获,因为将要200个请求返回401)。

1 个答案:

答案 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(),它可能在这种情况下很有用。