我正在尝试在我的项目中运行默认服务单元测试(从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包围