AngularJS + Jasmine:意外的http调用

时间:2018-03-01 13:59:37

标签: javascript angularjs jasmine karma-jasmine httpbackend

我开始为现有应用程序编写测试并遇到两个问题。

以下是服务方法I试图涵盖:

    function getClinic(id) {
        return $http
            .get("api/clinic/" + id)
            .then(function (resp) {
                return resp.data;
            })
    }

 it('should test getClinic method http call', function() {
  $httpBackend
    .expectGET("api/clinic/" + clinicId)
    .respond(200, $q.when(successResponse));

  clinicManager.getClinic(clinicId)
    .then(function(res) {
      httpOutput = res;
    });

  $httpBackend.flush();

  expect(clinicManager.getClinic).toHaveBeenCalledWith(clinicId);
  expect(httpOutput).toEqual(successResponse);
});

但我收到以下错误

Error: Unexpected request: GET /api/users/current

实际上,我确实在app load

上调用了以下路径
angular
    .module('module', [...])
    .config(...) 
    .run(function (userManager) {
        userManager.setCurrentUser();
        // I put this logic here to fetch currently logged user from back-end on every app load
    })

删除userManager.setCurrentUser();后,我收到了另一个错误

Error: Unexpected request: GET /dashboard

因此/dashboard是$ routeProvider

中指定的初始页面
 function Routes($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: '/dashboard',
        controller: 'dashboard.ctrl',
      })
      .when('/dashboard', {
        templateUrl: '/dashboard',
        controller: 'dashboard.ctrl',
      })
      //... other routes
     .otherwise({
       redirectTo: '/dashboard',
     });

所以我的问题是如何在不将http期望放入每个服务测试工具包的情况下避免出现这两个错误?

2 个答案:

答案 0 :(得分:3)

$httpBackend.flush();是坏人。 它将触发$ routeProvider将拦截并执行的广播。 一种解决方案是使用return false

来模拟该调用
$httpBackend.when('GET', '/dashboard').respond(false);

答案 1 :(得分:0)

我的问题是我整个应用程序都有一个模块,现在我明白这是完全错误的。我将我的应用程序拆分为不同的模块,当我为特定组件编写测试时,不需要上传整个应用程序,只需要上传组件所属的模块。我将应用程序.runrouteProvider配置删除到独立模块中,因此在我测试嵌套组件时无需上传新的配置模块。