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

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

本文关键字:包含 route location 单元测试 为什么      更新时间:2023-09-26

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

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

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

如果你对更多细节感兴趣,这里有一个plunker。为什么仅在单元测试$location时必须包含$route?

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

  • 第1213期
  • 相关承诺

测试不起作用的原因是$route执行重定向逻辑,而$route不是直接或间接从您的设置中实例化的。只有当$route作为依赖项注入到某个地方(例如ng-view指令)时,它才会被实例化。在实际的Angular设置中,您通常会在页面的某个位置配置$routeProvider并定义ng-view。如果不存在ng-view,那么$route真的不应该被实例化并执行额外的逻辑来减慢应用程序的速度。CCD_ 9和CCD_。

为了让这个工作,你必须要么

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