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

时间:2012-11-11 19:46:16

标签: unit-testing angularjs karma-runner

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

我已经读过它可能与referenced JavaScript files的顺序有关,但我似乎无法让它起作用,所以希望你们其中一人可以提供帮助。

我的测试配置如下:

  

basePath ='../';

     

files = [
  '公共/ JavaScript的/ lib目录/ jQuery的1.8.2.js',
  '公共/ JavaScript的/ lib目录/ angular.js',
  '公共/ Javascript角/ LIB / angular- .js文件',
   '公共/ app.js',
  '公共/控制器/
的.js',
  '公共/ directives.js',
  '公共/ filters.js',
  '公共/ services.js',
  茉莉,
  JASMINE_ADAPTER,
  '公共/ Javascript角/ LIB /角mocks.js',
  'test / unit / * .js'];

     

autoWatch = true;

     

browsers = ['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');
    }));
  });
});

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

  

ReferenceError:未定义模块

7 个答案:

答案 0 :(得分:258)

您缺少 angular-mocks.js 文件。

答案 1 :(得分:40)

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

以下是Angular Mocks代码的提取

(在关于' hacking之后的几条评论之后编辑'我在下面:这只是代码的摘录,这不是你自己需要写的东西,它已经是有!)

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 ,然后离开。

答案 2 :(得分:35)

window.module功能位于angular-mocks.js,是angular.mock.module的简写。正如the docs中所述,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 docs包含一个非常完整的例子。

答案 3 :(得分:11)

我们在单元测试中使用没有'angular'的'module',它工作正常。

CoffeeScript:

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

编译为

JavaScript的:

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

我唯一一次看到你所描述的错误,如果在testacular.conf.js文件中,在试图使用'module'的规范之前,文件部分中没有列出angular-mocks.js文件。如果我把它放在'文件'列表中的测试后,我得到

ReferenceError: Can't find variable: module

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

答案 4 :(得分:3)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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