我正在尝试在我的项目中运行默认服务单元测试(取自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:未定义模块
答案 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包围