128

我正在尝试在我的项目中运行默认服务单元测试(取自 GitHub 上的 Angular Seed 项目),但我不断收到错误“模块未定义”。

我已经读到这可能与引用的 JavaScript 文件的顺序有关,但我似乎无法让它工作,所以希望你们中的一个人能够提供帮助。

我的测试配置如下所示:

basePath = '../';

文件 = [
'public/javascripts/lib/jquery-1.8.2.js'、
'public/javascripts/lib/angular.js'、
'public/javascripts/lib/angular- .js'、
'public/app.js '、
'public/controllers/
.js'、
'public/directives.js'、
'public/filters.js'、
'public/services.js'、
JASMINE、
JASMINE_ADAPTER、
'public/javascripts/lib/angular-mocks。 js',
'test/unit/*.js' ];

自动监视 = 真;

浏览器 = ['Chrome'];

junitReporter = { outputFile:'test_out/unit.xml',套件:'unit'};

该服务如下所示:

angular.module('myApp.services', []).
  value('version', '0.1');

测试看起来像这样:

'use strict';

describe('service', function() {
  beforeEach(module('myApp.services'));


  describe('version', function() {
    it('should return current version', inject(function(version) {
      expect(version).toEqual('0.1');
    }));
  });
});

通过 testacular 运行测试时的错误是:

ReferenceError:未定义模块

4

7 回答 7

260

您缺少angular-mocks.js文件。

于 2012-11-15T15:15:10.527 回答
41

我遇到了同样的问题,并且我理解它为什么不起作用:必须在angular-mocks.js 文件之前引用 jasmine.js javascript。实际上,angular-mocks.js 会检查 Jasmine 是否已加载,只有加载时才会将模块功能添加到窗口中。

这是Angular Mocks 代码的摘录:

(在我下面关于“黑客”的几条评论之后进行编辑:这只是代码的摘录,这不是你需要自己编写的东西,它已经存在了!)

window.jasmine && (function(window) {

[...]

  window.module = angular.mock.module = function() {
    var moduleFns = Array.prototype.slice.call(arguments, 0);
    return isSpecRunning() ? workFn() : workFn;
    /////////////////////
    [...]
  };

简而言之:只需在angular-mocks.js之前 引用您的 jasmine.js 即可。

于 2013-08-06T08:24:59.553 回答
36

window.module函数来自angular-mocks.js,是angular.mock.module. 如文档中所述,该module功能仅适用于 Jasmine。

使用Testacular,将加载以下示例配置文件angular-mocks.js

/** example testacular.conf.js */

basePath = '../';
files = [
  JASMINE,
  JASMINE_ADAPTER,
  'path/to/angular.js',
  'path/to/angular-mocks.js',   // for angular.mock.module and inject.
  'src/js/**/*.js',             // application sources
  'test/unit/**/*.spec.js'      // specs
];
autoWatch = true;
browsers = ['Chrome'];

而且,正如其他地方所建议的,您可以使用调试日志运行 Testacular 以查看加载了哪些脚本(您也可以在检查器中看到相同的内容):

testacular --log-level debug start config/testacular.conf.js

angular.mock.inject文档包含一个非常完整的示例。

于 2013-01-05T01:27:08.190 回答
11

我们在单元测试中使用没有“角度”的“模块”,它工作正常。

咖啡脚本:

describe 'DiscussionServicesSpec', ->
    beforeEach module 'DiscussionServices'
    beforeEach inject ... etc.

编译为

JavaScript:

describe('DiscussionServices', function() {
    beforeEach(module('DiscussionServices'));
    beforeEach(inject(function ... etc.

我唯一一次看到类似于您描述的错误的情况是,如果在 testacular.conf.js 文件中,angular-mocks.js 文件未在规范尝试使用“模块”之前的文件部分中列出。如果我把它放在“文件”列表中的测试之后,我会得到

ReferenceError: Can't find variable: module

(我们的测试是通过 PhantomJS 运行的)

于 2012-11-15T03:49:39.873 回答
3

我在我的业力配置中包含了 angular-mocks.js,但仍然出现错误。事实证明,文件数组中的顺序很重要。(duh) 就像在 html 文档的头部一样,如果脚本在定义之前调用 angular,则会发生错误。所以我只需要在 angular.js 和 angular-mocks.js 之后包含我的 app.js。

于 2014-05-30T21:53:21.907 回答
0

如果您使用 Yeoman 及其角度生成器,您可能会收到此错误。特别是当你做教程(._.)
时,我通过将 angular-mocks.js 文件从 bower_components/angular-mocks 目录复制到 test/mock 目录来修复它。当然,您必须确保您的 karma.conf.js 文件配置正确。
问候!

于 2014-10-31T09:01:03.193 回答
0

当我做类似的事情时,我遇到了同样的问题var module = angular.module('my',[])。我需要确保它被 IIFE 包围

于 2016-10-18T14:51:30.010 回答