Unit testing 未定义角度返回模块中的测试服务
我试图在我的项目中运行默认的服务单元测试(取自GitHub上的Angular Seed项目),但我一直收到错误“模块未定义” 我曾读到,这可能和订单有关,但我似乎无法让它发挥作用,所以希望你们中的一位能够提供帮助 我的测试配置如下所示: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
'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;
/////////////////////
[...]
};