未定义Angular返回模块中的测试服务


127

我试图在我的项目中运行默认的服务单元测试(取自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'];

autoWatch = true;

浏览器= ['Chrome'];

junitReporter = {outputFile:'test_out / unit.xml',suite:'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');
    }));
  });
});

通过睾丸进行测试时的错误是:

ReferenceError:模块未定义


2
您可以在某个地方共享您的项目吗?我也许能帮上忙。您是否尝试打开调试级别以进行测试以查看根据您的配置实际加载了哪些文件?现在,可疑的部分是这个模式:public / javascripts / lib / angular-.js-它应该匹配什么?
pkozlowski.opensource

@JohnDoe谢谢你的工作。如果您添加答案,我会将其标记为已解决。原因是我正在跟踪种子项目,该项目确实如此并且有效。我不知道是否是因为它是早期版本。
Dofs

@Dofs是“'public / javascripts / lib / angular-.js'”和“'public / controllers / .js'”错字吗?
瑞安·奥尼尔

@ RyanO'Neill对不起,是的,这是一个错字。
Dofs

Answers:


260

您缺少angular-mocks.js文件。


8
需要注意的是angular.moduleangular.mock.module一样的。该window.module函数是的别名angular.mock.module。有关更多信息,请参见此答案
2013年

如先前的评论所述,angular.module不是angular.mock.module的别名。
Filippo De Luca

7
如果它提供有关如何提供所述文件的任何建议,则该答案将更加有用。我需要安装Bower,然后安装NgMocks。
isherwood

4
答案仅提供部分解决方案。这实际上是评论,而不是解释。下面的一些答案更为详细。
Gerome Bochmann

1
对于初学者,您需要angular-mockskarma.conf.js文件中添加对的引用,然后通过Karma(而不是Jasmine)运行测试。这样,运行Karma时,它将拾取angular-mocks扩展并将其合并到环境中。
路加福音

41

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

下面是一个提取的角度嘲笑代码:

(在下面我对“黑客”的一些评论之后进行编辑:这只是代码的一部分,这不是您需要自己编写的内容,它已经存在!)

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 即可。


这也可以通过确保在角mo之前先加载jasmine javascript文件来解决。比进行恶意更改以使工作正常工作,解决方案更干净。
foomip

@foomip谁建议进行修改?
斯蒂芬

您实质上是在应用程序中插入了hack,以确保以正确的方式加载-我并不是说hack的方式很糟糕(编写该代码段的方式没有错),但是当更新为茉莉花或其他原因导致该片段断裂或无法正常运行?它可能会或不会发生,但这是您代码中的责任,现在可以避免了,您不认为吗?
foomip

@foomip:我不确定您指的是什么,但是如果是上面的代码,那不是我写的,我只是引用它来解释问题。该代码是角度模拟的一部分。该修补程序仅是在引用另一个文件之前的一个问题。
Antoine Jaussoin 2014年

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文档包含一个非常完整的示例。


也许值得注意的是,module现在还与摩卡
罗宾帽衫

11

我们在单元测试中使用不带“角度”的“模块”,并且效果很好。

CoffeeScript:

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

编译成

JavaScript:

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

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

ReferenceError: Can't find variable: module

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


2
得出的结论是,必须有角-。
阿德里安

3

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


0

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.