我现在被困了一段时间,试图设置单元测试并运行。
我有一个AngularJS前端,其中装载了RequireJS和r.js,并对其进行了优化,因此所有这些都很好地放在一个文件中。这行得通!
不起作用的是执行单元测试。到目前为止,这并没有什么特别之处,只是从一个教程中复制了一个初学者。
tests/user/user.test.js
define(['angular', 'angular-mocks', 'app'], function(angular, app) {
describe('Unit: UserController', function() {
beforeEach(module('user.app'));
it('should do something', function() {
console.log('did it');
});
});
});
那我就有karma.conf.js
了
module.exports = function(config) {
config.set({
logLevel: config.LOG_DEBUG,
basePath: './',
files: [
// r.js'd app files
{pattern: 'dist/app.js', included: false},
// the tests
{pattern: 'tests/**/*.test.js', included: true},
],
excluded: ['tests/main.test.js']
frameworks: ['jasmine', 'requirejs'],
browsers: ['PhantomJS'],
plugins: [
'karma-jasmine',
'karma-junit-reporter',
'karma-phantomjs-launcher',
'karma-requirejs'
],
});
};
一个main.test.js
var allTestFiles = [];
var TEST_REGEXP = /(spec|test)\.js$/i;
var pathToModule = function(path) {
var returnValue = path.replace(/^\/base\//, '').replace(/\.js$/, '');
return returnValue;
};
Object.keys(window.__karma__.files).forEach(function(file) {
if (TEST_REGEXP.test(file)) {
// Normalize paths to RequireJS module names.
allTestFiles.push(pathToModule(file));
}
});
require.config({
baseUrl: '/base',
paths: {
'angular-mocks': 'node_modules/angular-mocks/angular-mocks',
'app': 'dist/app',
},
deps: allTestFiles,
callback: function() {
console.log('load complete');
window.__karma__.start();
},
});
最后是一个gulp
任务:
var gulp = require('gulp');
var karma = require('karma').server;
gulp.task('unit-test', function(done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, function() { done(); });
}
在这里和那里,我添加了一些日志输出,它显示文件是加载的。
但是我被困在了Error: Mismatched anonymous define()
的tests/user/user.test.js
里,我不知道是怎么回事。这是输出:http://pastebin.com/evJPj9B3
如果我将单元测试模块命名为
define('namedtestorso', ['angular', 'angular-mocks', 'app'], function(angular, app) {
...
..。我不再有错误了,但是测试没有执行。由于我可以回忆的所有例子,使用它作为匿名定义,我认为命名是不正确的这里。但是在这种情况下,日志输出将被执行,显示来自main.test.js
的配置回调被执行了两次。(这是个暗示吗?)
如果有人知道如何修复它/让它运行,甚至是如何继续找出问题所在,那就太好了。提前感谢!
发布于 2015-07-01 07:09:35
我现在正在运行它,所以将我的解决方案留在这里:
我想我现在更了解karma
是如何工作的(如果我错了,请告诉我),所以我找到了我必须做的事情。
这似乎完全是为了将文件放入karma.conf.js
,这样就可以加载main.test.js
了。否则,它们就脱离了“上下文”,无法被访问。但是,当放入其中时,请确保将included
标志设置为false
。
对karma.conf.js
的更改
files: [
...
// Also included these dependencies. All the others are minified in the
// app.js but if you don't do that, also include all project deps like
// AngularJS etc.
{ pattern: 'node_modules/jasmine-core/lib/jasmine-core/boot.js', included: false },
{ pattern: 'node_modules/angular-mocks/angular-mocks.js', included: false},
// Then I had an error in my pattern ('tests/**/*.test.js')
// Only the `main.test.js` is supposed to be included!
{ pattern: 'tests/user/user.test.js', included: false }
{ pattern: 'tests/main.test.js', included: true }
...
如果我是正确的,Karma将创建一个included: true
文件,并通过脚本标记加载文件。这就是为什么如果使用RequireJS,重要的是将include
设置为false
,因为这样做会得到Error: Mismatched anonymous define()
。所以这对我来说是有意义的。
在解决了这个问题之后,其他的模块就找不到了。因为我使用了RequireJS优化器,所以我必须将我的所有模块“映射”到主app.js
文件中,以便当测试JS文件需要某个模块时,RequireJS可以确保它已经加载(或得到)。
因此,我最终更改了main.test.js
中的main.test.js
部分
paths: {
// Added these for example
'angular': '../dist/app',
'angular-ui-router': '../dist/app',
// (and also my project modules)
...
好吧,这听起来有点烦人。同时,在解决了这个问题之后,我还将我的工作流程更改为在dev文件上运行单元测试,并依赖其他工具正常工作(如果不是,则由e2e测试捕获问题)。
希望它能帮助我的处境中的其他人!
发布于 2016-02-03 10:45:46
准确地说,如果您转到requirejs站点,此错误声明如果您在html中包含了任何脚本标记,这意味着由业力提供的html。
因此,在karma.conf.js中,当您包含像:karma.conf.js这样的文件时,我认为它是作为脚本标记添加的,并且您继续获取错误:不匹配的匿名定义()模块
尝试模式示例:{ pattern:‘/base/src/ script /xyz.js’,包括: false},它防止在脚本标记中添加js
https://stackoverflow.com/questions/31109522
复制相似问题