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

AngularJS: How does controller know it should use a mocked dependency in place of original one?

测试中的依赖注入让我很困惑。 具体在官方教程的 chapter 5 中,我可以看到 $httpBackend 配置为提供假响应:

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

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

在同一个代码片段中,如果控制器是用这样的东西初始化的:

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

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

但考虑到上述教程中的情况并非如此:

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

并且只有范围被传递给 $controller,我看不到任何可以 link 将 $httpBackend 传递给控制器​​的东西。

我只是很困惑控制器如何知道新的模拟 service/dependency。

谢谢

$http 未替换为 $httpBackend$http 在内部使用 $httpBackend。没有 ngMock 模块,它使用 service documented here. Then, when including the ngMock module, it uses the service documented here。因此,对于 ngMock 模块,它只是对 $httpBackend 服务给出了不同的定义。