AngularJS + Jasmine:意外的 http 调用

AngularJS + Jasmine: Unexpected http calls

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

这是我要介绍的服务方法:

    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

确实,我确实在应用加载时调用了以下路由

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 期望放入每个服务测试工具包中,我如何才能避免出现这两个错误?

$httpBackend.flush(); 是这里的坏人。 它将触发一个广播,$routeProvider 将拦截该广播并对其进行操作。 一种解决方案是使用 return false

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

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