Angular Returns中的测试服务未定义



我正在尝试在我的项目中运行默认服务单元测试(从GitHub上的Angular Seed Project取),但是我一直在遇到"模块未定义"的错误。p>我已经读到,这可能与引用的JavaScript文件的顺序有关,但我似乎无法使其工作,所以希望你们中的一个人能够提供帮助。

我对测试的配置如下:

basepath ='../';

files = [
'public/javascripts/lib/jquery-1.8.2.js',
'public/javaScripts/lib/angular.js',
'public/javaScripts/lib/angular- .js',
'public/app.js',
'公共/控制器/
.js',
'public/dicistives.js',
'public/filters.js',
'public/services.js',
茉莉,
Jasmine_adapter,
'public/javaScripts/lib/angular-mocks.js',
'test/unit/*。js'];

autoWatch = true;

浏览器= ['chrome'];

junitreporter = {outputfile:'test_out/unit.xml',套房:'utit' };

服务看起来如下:

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

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

参考文献:未定义模块

您缺少 Angular-Mocks.js file。

我也有同样的问题,我理解为什么它不起作用:jasmine.js javascript 必须在 the angular-mocks.js文件之前引用。实际上,Angular-Mocks.js检查是否加载了茉莉花,并且只有当它是将模块函数添加到窗口的情况下。

这是Angular模拟代码的提取

(在有关"黑客攻击"的几个评论后进行编辑:这只是代码的摘录,这不是您需要写的东西,它已经存在了!)

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之前引用茉莉花。

window.module函数以Angular-Mocks.js为单位,是angular.mock.module的速记。如文档中所述,module功能仅适用于茉莉。

使用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'];

和,如其他地方所建议的,您可以使用Debug Logging进行testacular,以查看加载了哪些脚本(您也可以在检查员中看到相同的脚本):

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

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

我们在单位测试中使用没有'Angular'的'模块',并且效果很好。

咖啡网:

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

complot

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,但仍会遇到错误。事实证明,订单在文件数组中很重要。(DUH)就像在HTML DOC的头上一样,如果脚本在定义之前调用Angular,并且发生错误。因此,我只需要在Angular.js和Angular-Mocks.js之后包括我的app.js。

如果您使用的是yeoman及其Angular-Generator,则可能会遇到此错误。特别是当您进行教程(._。)
我通过复制Angular-Mocks.js文件将其修复,从Bower_components/Angular Mocks DIR到测试/模拟DIR。当然,您必须确保您的Karma.conf.js文件已正确配置。
问候!

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

最新更新