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
服务给出了不同的定义。
测试中的依赖注入让我很困惑。 具体在官方教程的 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
服务给出了不同的定义。