【问题标题】:Do I need to define the Module dependency when unit testing a Controller in Karma?在 Karma 中对控制器进行单元测试时是否需要定义模块依赖项?
【发布时间】:2014-07-15 15:18:29
【问题描述】:

我有一个 AngularJS + RequireJS + Karma + Jasmine 的项目。
我的项目结构如下:

lib
--angular.js
--angular-mocks.js
--require.js
node_modules
--(...)
test
--test-main.js
--spec
  --firstTest-spec.js
web
--js
  --require_config.js
  --controllers
    --MainController.js
  --modules
    --AppModule.js
index.html
karma.conf.js

在我的测试文件中,我有以下代码:

define(['angularMocks', 'modules/AppModule'],
    function(angularMocks, AppModule) {

        describe("my test suite", function() {
            var scope;

            beforeEach(module('AppModule'));

            it('testing for a controller', inject(function($rootScope, $controller) {
                var scope = $rootScope.$new();
                var ctrl = $controller('MainController', {
                  $scope : scope
                });
                console.log("The test is running ->" + ctrl);
            }));
        });
    });

这样就可以了,因为我使用的是AppModule 依赖项。问题是我只想测试Controller,而Controller 本身是独立的。所以我尝试了这样的事情: define(['angularMocks', 'controllers/MainController']

但是,如果我尝试像这样访问 Controller,我将无法正常工作。

由于我在其他地方找不到我的问题的答案,我问,我是否必须始终引用我正在测试的 ControllerModule,或者我可以在没有 Module 引用的情况下测试我的 Controller ?

【问题讨论】:

    标签: angularjs unit-testing requirejs karma-runner karma-jasmine


    【解决方案1】:

    控制器不能只在模块的上下文中定义,因此您需要定义一些模块才能测试控制器。

    如果您希望能够在不引入主应用程序模块的其他部分的情况下隔离控制器的测试,您可以将控制器放在它自己的模块中:

    // MainController.js:
    
    define([], 
        function() {
            return angular.module('mainController', []).
                controller('MainController', /* ... */);
        });
    
    
    // AppModule.js:
    
    define(['controllers/MainController'], 
        function(mainControllerModule) {
            return angular.module('AppModule', [mainControllerModule.name]);
        });
    

    或者(可能取决于您关于如何组织模块的理念),如果您只想从测试文件中隐藏控制器依赖于应用程序模块的事实,您可以使用如下方法:

    // MainController.js:
    
    define(['modules/AppModule'], 
        function(AppModule) {
            return angular.module(AppModule.name).
                controller('MainController', /* ... */);
        });
    
    
    // AppModule.js:
    
    define([], 
        function() {
            return angular.module('AppModule', []);
        });
    
    
    // firstTest-spec.js:
    
    define(['angularMocks', 'controllers/MainController'], 
        function(angularMocks, MainControllerModule) {
            // ...
            beforeEach(module(MainControllerModule.name));
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多