【问题标题】:How to instantiate angular controller for testing with intern如何实例化角度控制器以使用实习生进行测试
【发布时间】:2015-09-09 11:16:41
【问题描述】:

我正在尝试使用实习生测试框架测试角度控制器。我已经成功测试了角度服务。然而,当尝试使用 $controller('myController', { '$scope': scope }); 加载控制器时

我收到一条未知的提供程序错误消息。

我的选项是传递一个字符串,它是已注册的控制器的名称,或者将控制器作为函数传递。为了避免污染全局范围,我选择使用 module().controller() 语法注册控制器。这意味着我需要将名称作为字符串传递。

控制器定义如下:

app.controller('UnitsCtrl', [
    '$scope',
    '$http',
    'auth',
    function ($scope, $http, auth) {
        // do stuff
    }
]);

在实习测试中,我像这样加载模块:

define([
    'intern!object',
    'intern/chai!assert',
    'intern/order!bower_components/angular/angular',
    'intern/order!bower_components/angular-mocks/angular-mocks',
    'intern/order!public/src/javascripts/app.controllers' ],
    function (registerSuite, assert, ng, ngMock, appControllers) {

然后使用对象测试符号我在整个测试过程中注册我需要的变量:

registerSuite(function () {
    var $injector, unit, scope, $rootScope,
    $controller, UnitsCtrl, $window;
    return {
        name: 'Units controller',

在设置函数中,我实例化了注入器,传递了测试所需的模块。并实例化控制器提供者和根作用域。

setup: function() {
    $injector = angular.injector(['ng',  app.controllers' ]);
    $rootScope = $injector.get('$rootScope');
    $controller = $injector.get('$controller');

最后,在每次测试之前,我都会尝试实例化被测控制器:

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

当我运行测试时,会产生以下抱怨:

! [$injector:unpr] Unknown provider: authProvider <- auth <- UnitsCtrl

让我困惑的是为什么它在身份验证服务中寻找 UnitsCtrl 控制器?!

【问题讨论】:

    标签: angularjs unit-testing intern


    【解决方案1】:

    事实证明,未知的提供者投诉与我尝试实例化的控制器无关,而是与它的依赖项之一有关。因为我没有加载服务模块,所以找不到依赖关系(它没有注册)。

    修复方法是模拟依赖项并将其作为第二个参数的对象的一部分传递给控制器​​。

    auth = { //stuff };
    UnitsCtrl = $controller('UnitsCtrl', { '$scope': scope, 'auth': auth});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多