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

时间:2015-03-20 16:05:05

标签: javascript angularjs unit-testing jasmine

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

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?

我看到许多似乎有关的讨论:

1 个答案:

答案 0 :(得分:3)

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

为了实现这一目标,您必须

  1. 在某处注入$route
  2. $compile的元素执行ng-view。这一点很重要 在尝试错误的位置之前$route进行实例化 或者$route无法知道重定向到otherwise位置。