为什么仅在对 $location 进行单元测试时必须包含 $route?

Why does $route have to be included when unit testing $location only?

我想编写一个单元测试来确认我的 "otherwise" 逻辑是否正常工作。这就是我期望的方式:

it('should handle unknown routes properly', inject(function($location, $rootScope) {
    $location.path('/unknown');

    $rootScope.$digest();

    expect($location.path()).toBe('/yikes');
}));

然而,我发现我必须注入 $route 才能使这个测试工作。请记住,单元测试代码不必使用 $route 但显然需要实例化它才能使 $location 正常工作。

如果您对更多详细信息感兴趣,请点击此处 plunkr。为什么仅对 $location 进行单元测试时必须包含 $route?

我看到很多似乎相关的讨论:

您的测试不起作用的原因是 $route 执行重定向逻辑,并且 $route 未直接或间接从您的设置中实例化。 $route 只有在作为依赖项注入某处时才会实例化,例如 ng-view 指令。在真正的 Angular 设置中,您通常会配置 $routeProvider 并在页面的某处定义 ng-view。如果 ng-view 不存在,那么 $route 真的不应该被实例化并执行会减慢应用程序速度的额外逻辑。 $routeng-view 应该一起使用。

为了使它正常工作,您必须

  1. 在某处注入 $route
  2. 对具有 ng-view 的元素执行 $compile。这一点很重要 在尝试错误位置之前实例化 $route 否则 $route 不知道重定向到 otherwise 位置。