模拟$ httpBackend - 如何处理"意外请求,不再需要更多请求"?

时间:2014-03-14 12:32:29

标签: angularjs jasmine karma-runner

我有一个像这样编码的Jasmine测试:

  it ("should send correct message to server to get data, and correctly set up scope when receiving it", function(){
    $httpBackend.when('GET', 'https://localhost:44300/api/projectconfiguration/12').respond(fakedDtoBase);
    $routeParams.projectId=fakeId; // user asks for editing project
    scope.$apply(function(){
        var controller=controllerToTest(); // so controller gets data when it is created
    });
    expect(scope.projectData).toEqual(fakedDtoBase);
});

它有点工作,但我收到错误:

Error: Unexpected request: GET views/core/main/main.html
No more request expected
    at $httpBackend (C:/SVN/src/ClientApp/client/bower_components/angular-mocks/angular-mocks.js:1207:9)
    at sendReq (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7800:9)
    at $http.serverRequest (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7534:16)
    (more stack trace)....

我意识到我可以嘲笑其他所有电话。但是,让我说我不关心我的测试想要加载什么,因为它可能会调用其他一些东西。 我怎样才能确保所有其他请求只是静静地发生",或许可以为其他一切提供单一的虚拟响应?

3 个答案:

答案 0 :(得分:47)

您的测试失败,因为您发出了未指定的请求。

尝试添加:

$httpBackend.when('GET', 'views/core/main/main.html').respond(fakedMainResponse);

当然,您还应该定义fakedMainResponse

请查看documentation(请求期望与后端定义部分),其中说:

  

请求期望提供了一种对请求进行断言的方法   由应用程序制作并定义对这些请求的响应。   如果没有提出预期请求,测试将失败   订单错误。

$httpBackend.when的第二个参数实际上是RegExp。因此,如果您提供的RegExp符合所有其他请求,则应该有效。

答案 1 :(得分:15)

对于那些使用httpBackend在EndToEnd测试中模拟http调用或仅模拟应用程序的整个http调用的人,解决方案是在app config部分添加以下代码(根据模板的位置更改regexp):

$httpBackend.whenGET(/^\/templates\//).passThrough();

参考:https://docs.angularjs.org/api/ngMockE2E/service/ $ httpBackend

使用angularjs 1.4测试以在集成ui-router

时修复类似问题

答案 2 :(得分:0)

我认为同样重要的是要注意,如果您有$digest(),您的期望应该遵循$digest,如下:

_$rootScope_.$digest();
$httpBackend.when('GET', 'views/core/main/main.html').respond(fakedMainResponse);
// ...
$httpBackend.flush(); // And remember to flush at the end