3

我正在使用策略在我的 AngularJS 应用程序中使用 RequireJS 延迟加载内容:

define([
  'src/services/dependency_resolver', // resolves promise when dependencies are `require`d
  'json!modules.json'
], function (dependencyResolver, modules) {
  var app = angular.module('myApp', [ 'ngRoute' ]);

  app.config(function ($controllerProvider, $routeProvider) {
    app.lazy = {
      controller: $controllerProvider.register
      // <...> other providers
    };

    angular.forEach(modules, function (moduleConfig) {
      angular.forEach(moduleConfig.routes, function (route) {
        $routeProvider.when(route.path, {
          templateUrl: route.templateUrl,
          controller: route.controller,
          resolve: dependencyResolver(moduleConfig.dependencies)
        });
      });
    });
  });

  return app;
});

但我不确定测试延迟加载控制器的正确方法是什么。它是这样注册的:

define(['src/app'], function (app) {
  app.lazy.controller('MainCtrl', function () {
    //
  });
});

这是我目前的规格:

describe('`MainCtrl` controller', function () {

  var Ctrl,
      $scope;

  beforeEach(angular.mock.module('myApp'));

  beforeEach(function (done) {
    require(['module/main'], done);
  });

  beforeEach(function () {
    angular.mock.inject(function ($rootScope, $controller) {
      $scope = $rootScope.$new();

      Ctrl = $controller('MainCtrl', {
        $scope: $scope
      });
    });
  });

  it('should ...', function () {
    console.log(Ctrl);
  });

});

使用此规范,注册控制器时会发生错误,因为app.lazy未定义。

所以问题是如何测试这样的控制器?

干杯!

4

2 回答 2

1

在使用“lazy”属性来注册我的控制器编写单元测试时,我遇到了类似的问题。这种方法的问题在于,在单元测试的上下文中,模块配置块将不会被执行,因此 app.lazy 将解析为undefined

为了解决您的问题,不应使用提供者注册方法来设置您的app.lazy属性,而应使用提供者注册方法来覆盖模块上的对应项。换句话说,你的配置块现在应该变成:

`app.config(function ($controllerProvider, $routeProvider) {  
    app.controller = $controllerProvider.register
    // <...> other providers  
    .......
}`

而不是使用(app.lazy)注册您的控制器:

`define(['src/app'], function (app) {
   app.lazy.controller('MainCtrl', function () {
   //
   });
});`

你可以这样定义:

`define(['src/app'], function (app) {
   app.controller('MainCtrl', function () {
   //
   });
});`

这应该工作!希望这可以帮助,如果这行得通,请告诉我。

于 2014-03-18T05:22:41.930 回答
0

首先,感谢您提供的参考 - 这篇文章真的很有趣。

这篇文章的作者正在使用 AngularJs 提供者来实现他的策略。问题是,AngularJs 没有“规范”的提供者。所以我的意见是你应该在你的单元测试中忽略这个策略。

在此基础上,我认为您应该将 AMD 添加到您的规范文件中。将您的控制器定义为规范中的依赖项。在此之后,您可能只需要在main-spec.js中的某个位置获取所有规范并启动您的测试框架。

于 2013-12-21T22:34:21.283 回答