没有定义angular度返回模块中的testing服务

我试图在我的项目中运行默认的服务unit testing(从GitHub上的Angular Seed项目中获取),但是我一直收到错误“模块未定义”。

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

我的testingconfiguration如下所示:

basePath ='../';

files = [
'公共/ JavaScript的/ lib目录/ jQuery的1.8.2.js',
'公共/ JavaScript的/ lib目录/ angular.js',
'public / javascripts / lib / angular- .js',
'公共/ app.js',
'public / controllers / .js',
'公共/ directives.js',
'公共/ filters.js',
'公共/ services.js',
茉莉,
JASMINE_ADAPTER,
'公共/ Javascriptangular/ LIB /angularmocks.js',
'test / unit / *。js'];

autoWatch = true;

browsers = ['Chrome'];

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

该服务如下所示:

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

testing看起来像这样:

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

而通过testing运行testing的错误是这样的:

ReferenceError:模块没有定义

您缺lessangular-mocks.js文件。

我有同样的问题,我明白了为什么它不工作:jasmine.js JavaScript 必须在angular-mocks.js文件之前引用 。 的确,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, 然后离开。

window.module函数来自angular-mocks.js ,是angular.mock.module的缩写。 正如在文档中提到的 , modulefunction只适用于Jasmine。

使用Testacular ,下面的示例configuration文件将加载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']; 

而且,正如其他地方所build议的那样,您可以使用debugging日志logging运行Testacular来查看加载的脚本(您也可以在检查器中看到相同的内容):

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

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

我们在unit testing中使用没有“angular”的“模块”,它工作正常。

CoffeeScript的:

 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文件在规范尝试使用“module”之前未在文件部分中列出。 如果我在“文件”列表中的testing之后把它拿来了

 ReferenceError: Can't find variable: module 

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

我已经在我的karmaconfiguration中包含了angular-mocks.js,但仍然出现错误。 事实certificate,在文件arrays中的顺序是重要的。 (duh)就像在html文档的头部一样,如果脚本在定义之前调用angular度,就会发生错误。 所以我只需要在angular.js和angular-mocks.js之后join我的app.js。

如果你使用Yeoman和angular发生器,你可能会得到这个错误。 特别是当你做教程(._。)时
我通过将angular-mocks.js文件从bower_components / angular-mocks目录复制到test / mock目录来修复它。 当然,你必须确定,你的karma.conf.js文件configuration正确。
问候!

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