Unit testing 未定义角度返回模块中的测试服务

Unit testing 未定义角度返回模块中的测试服务,unit-testing,angularjs,karma-runner,Unit Testing,Angularjs,Karma Runner,我试图在我的项目中运行默认的服务单元测试(取自GitHub上的Angular Seed项目),但我一直收到错误“模块未定义” 我曾读到,这可能和订单有关,但我似乎无法让它发挥作用,所以希望你们中的一位能够提供帮助 我的测试配置如下所示: 'use strict'; describe('service', function() { beforeEach(module('myApp.services')); describe('version', function() { it

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

我曾读到,这可能和订单有关,但我似乎无法让它发挥作用,所以希望你们中的一位能够提供帮助

我的测试配置如下所示:

'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');
    }));
  });
});
基本路径=“../”

文件=[
“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/directions.js”,
“public/filters.js”,
“public/services.js”,
茉莉花,
JASMINE_适配器,
“public/javascripts/lib/angular mocks.js”,
'test/unit/*.js']

自动观察=真

浏览器=['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');
    }));
  });
});
通过TestCular运行测试时的错误如下:

ReferenceError:未定义模块


我们在单元测试中使用“模块”而不使用“角度”,它工作得很好

咖啡脚本:

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运行)

您缺少angular mocks.js文件。

进入
窗口.module
函数,它是
angular.mock.module
的缩写。如中所述,
模块
功能仅适用于Jasmine

使用,下面的示例配置文件将加载
angularmocks.js

/**示例testacular.conf.js*/
基本路径=“../”;
文件=[
茉莉花,
茉莉花,
'path/to/angular.js',
'path/to/angular mocks.js',//用于angular.mock.module和inject。
“src/js/***.js”,//应用程序源代码
'test/unit/***.spec.js'//规格
];
自动观察=真;
浏览器=['Chrome'];
而且,正如其他地方所建议的,您可以运行带有调试日志的TestCular来查看加载了哪些脚本(您也可以在inspector中看到相同的脚本):


其中包括一个非常完整的示例。

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

以下是角度模拟代码的摘录:

(在下面我对‘黑客’的几句评论之后编辑:这只是代码的摘录,你不需要自己编写,它已经存在了!)

简言之:
只需在
angular-mocks.js之前引用你的jasmine.js,然后就可以开始了。

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

如果你使用的是Yeoman及其angular generator,你可能会遇到这个错误。尤其是当你学习教程时(.。)
我通过将angular-mocks.js文件从bower_components/angular mocks dir复制到test/mock dir来修复它。当然,您必须确保karma.conf.js文件配置正确。

你好

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

你能在什么地方分享你的项目吗?我也许能帮上忙。您是否尝试打开TestCular的调试级别以查看根据您的配置实际加载了哪些文件?目前,可疑的部分是这样的模式:public/javascripts/lib/angular-.js-它应该匹配什么?@JohnDoe谢谢你的帮助。如果你添加一个答案,我会将其标记为已解决。原因是我在跟踪种子项目,它就是这样做的,而且很有效。我不知道这是否是因为它是一个早期版本。@dof是“'public/javascripts/lib/angular-.js'”和“'public/controllers/.js'”拼写错误?@RyanO'Neill抱歉,是的,这是一个拼写错误。请注意,
angular.module
angular.mock.module
不一样。
window.module
函数是
angular.mock.module
的别名。如前所述,angular.module不是angular.mock.module的别名。如果此答案提供了有关如何提供所述文件的任何建议,则会更加有用。我需要安装Bower,然后安装NgMocks。答案只提供了部分解决方案。这实际上是一个评论,而不是一个解释。下面的一些答案更为详细。对于初学者,您需要在
karma.conf.js
文件中添加对
angular mock
的引用,并通过karma而不是Jasmine运行测试。这样,当Karma运行时,它会选择
角度模拟
扩展并将它们合并到环境中。结论是角度模拟是一项要求。这也可以通过确保在角度模拟之前加载jasmine javascript文件来解决。比进行黑客更改更干净的解决方案。@foomip谁建议进行黑客更改?你本质上是在你的应用程序中插入了一个黑客,以确保以正确的方式加载内容-我并不是说黑客的方式不好(你写的方式没有错)
window.jasmine && (function(window) {

[...]

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