【问题标题】:AngularJS: How does controller know it should use a mocked dependency in place of original one?AngularJS:控制器如何知道它应该使用模拟依赖项来代替原始依赖项?
【发布时间】:2015-03-20 10:32:10
【问题描述】:

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

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

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

在相同的代码 sn-p 中,如果控制器是这样初始化的:

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

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

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

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

只有作用域被传递给$controller,我看不到任何将$httpBackend链接到控制器的东西。

我只是对控制器如何知道新的模拟服务/依赖关系感到困惑。

谢谢

【问题讨论】:

    标签: angularjs unit-testing controller jasmine


    【解决方案1】:

    $http 不会被 $httpBackend 替换。 $http 在内部使用 $httpBackend。没有ngMock 模块,它使用service documented here。然后,当包含ngMock 模块时,它使用service documented here。所以对于ngMock 模块,它只是对$httpBackend 服务是什么给出了不同的定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2014-09-23
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      相关资源
      最近更新 更多