【问题标题】:angular karma jasmine unit test for a controller控制器的角度业力茉莉花单元测试
【发布时间】:2015-07-02 20:59:59
【问题描述】:

我正在使用 Jasmine on Karma 将 userController 模块添加到我的 SPA 项目中。我收到一条错误消息,提示“错误:[$injector:modulerr] 无法实例化模块 myApp.controllers,原因是:错误:[$injector:nomod] 模块‘myApp.controllers’不可用!”。该应用程序运行良好。由于某种原因,它只是单元测试没有看到控制器模块。感谢您的帮助。

/// <reference path="~/scripts/_references.js" />
/// <reference path="~/scripts/controllers/userController.js" />

'use strict';

describe('Controllers: userCtrl', function() {
      var scope, ctrl;

      beforeEach(function() {
        module('myApp.controllers');
      });

      beforeEach(inject(function($rootScope, $controller) {
        scope = $rootScope.$new();
        ctrl = $controller('userCtrl', {
          $scope: scope
        });
      }));

      it("Should be false", function() {
        expect(false).toBeFalsy();
      });
    }

mainController.js 在模块声明中仅包含两行 ['myApp.factories'] 作为依赖项,如下所示:

'use strict';

angular.module('myApp.controllers', ['myApp.factories']);

实际的控制器在他们自己的 .js 文件中,并且在声明中没有 [ ] 的 angular.module('myApp.controllers') 。 userController.js 是这样的:

'use strict';

angular.module('myApp.controllers')
  .controller('userCtrl', ['$scope', '$location', '$window', 'version',
    function ($scope, $location, $window, version)
    {
      $scope.$root.title = 'AngularJS SPA | User';
      $scope.appVersion = version;
      $scope.title = 'User';
      $scope.content = "my contents goes here";
    }]);

在 karma.conf.js 中,我在文件中有以下内容:属性。

files: [
          'bower_components/angular/angular.js',
          'bower_components/angular-ui-router/release/angular-ui-router.js',
          'bower_components/angular-mocks/angular-mocks.js',
          'bower_components/angular-resource/angular-resource.js',
          'bower_components/jquery/dist/jquery.js',
          'myApp/scripts/controllers/*.js',
          'myApp/scripts/tests/*.spec.js',
          'myApp/scripts/tests/**/*.spec.js'
        ],

【问题讨论】:

  • 你在使用 require / browserify / webpack 吗?

标签: angularjs unit-testing


【解决方案1】:

问题来自myApp.factories,我在 karma 文件观察程序的任何地方都没有看到这个声明的模块。在控制器行之前,放置 myApp.factories 模块的路径,应该可以正常工作。

【讨论】:

    【解决方案2】:

    我的 Karma.conf.js 现在有以下内容,但现在 Karma 抱怨错误:[$injector:itkn] Incorrect injection token!预期的服务名称为字符串,但未定义。

    files: [
      'bower_components/angular/angular.js',
      'bower_components/angular-mocks/angular-mocks.js',
      'bower_components/angular-resource/angular-resource.js',
      'bower_components/angular-ui-router/release/angular-ui-router.js',
      'bower_components/jquery/dist/jquery.js',
      'AngularSPA/Scripts/factories/services.js',
      'AngularSPA/Scripts/factories/factories.js',
      'AngularSPA/scripts/controllers/mainController.js',
      'AngularSPA/scripts/controllers/*.js',
      'AngularSPA/scripts/tests/*.spec.js',
      'AngularSPA/scripts/tests/**/*.js'
    ],
    

    【讨论】:

    • 这可能来自您尝试注入控制器的version。检查您是否在 Karma conf.js 中提供了声明的文件。如果version 是您使用的角度版本,则无需任何注入即可轻松访问它:$scope.appVersion = angular.version( ) 返回一个对象。更多详情:docs.angularjs.org/api/ng/object/angular.version
    • 谢谢。版本是我在 service.js 中定义的值提供者,如下所示: angular.module('cmtApp.services', []) .value('version', '5.0');
    猜你喜欢
    • 1970-01-01
    • 2017-10-09
    • 2023-04-06
    • 2020-08-19
    • 2016-06-14
    • 2013-06-16
    • 1970-01-01
    • 2016-06-15
    • 2014-12-12
    相关资源
    最近更新 更多