AngularJS:控制器如何知道应该使用模拟依赖来代替原始依赖?

时间:2015-01-21 19:21:34

标签: angularjs unit-testing controller jasmine

测试中的依赖注入对我来说很困惑。 特别是在官方教程的chapter 5中,我可以看到$ httpBackend配置为提供虚假响应:

$httpBackend = _$httpBackend_;
$httpBackend.expectGET('phones/phones.json').
    respond([{name: 'Nexus S'}, {name: 'Motorola DROID'}]);

但我无法看到的是控制器想要使用这个新定义的依赖项而不是$http定义中引入的原始PhoneListCtrl

在相同的代码片段中,如果控制器是使用以下内容初始化的:

scope = $rootScope.$new();
ctrl = $controller('PhoneListCtrl', {
                                     $scope: scope,
                                     $http: $httpBackend});

我可以理解我们正在覆盖依赖关系,因此当控制器想要访问$http时,它将使用我们的模拟。

但鉴于上述教程中并非如此:

scope = $rootScope.$new();
ctrl = $controller('PhoneListCtrl', {$scope: scope});

并且只有范围传递给$controller,我无法看到任何可以将$httpBackend链接到控制器的内容。

我很困惑控制器如何知道新的模拟服务/依赖。

由于

1 个答案:

答案 0 :(得分:1)

$http未被$httpBackend取代。 $http在内部使用$httpBackend。如果没有ngMock模块,则使用service documented here。然后,当包含ngMock模块时,它使用service documented here。因此,对于ngMock模块,它只是为$httpBackend服务提供了不同的定义。