Javascript UMD的Grunt测试
我正试图找出使用UMD工厂测试Javascript模块定义的最佳方法,类似于: 我不想测试模块本身,我想测试模块是否在各种环境中正确“导出/创建”:Javascript UMD的Grunt测试,javascript,node.js,requirejs,jasmine,gruntjs,Javascript,Node.js,Requirejs,Jasmine,Gruntjs,我正试图找出使用UMD工厂测试Javascript模块定义的最佳方法,类似于: 我不想测试模块本身,我想测试模块是否在各种环境中正确“导出/创建”: 如果是CommonJS(节点),模块是否正确导出 如果是AMD,它的定义是否正确 如果浏览器(不带requirejs),是否创建了正确的全局浏览器 我想使用grunt和jasmine运行这些测试。我可以使用grunt contrib jasmine测试第2点和第3点,但不能测试第1点 我想我可以使用grunt contrib jasmine和gru
在较高的层次上,有人知道有没有任何现有的方法可以在不使用多个grunt插件的情况下实现这一点吗?最后,我决定使用混合任务,使用grunt contrib jasmine进行浏览器全局和浏览器AMD测试,使用jasmine_node进行CommonJS测试。我只有一个规格 支持所有3个模块类型测试的文件 这是我的grunt配置:
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
jasmine: {
browserGlobal: {
src: ['src/Foo.js'],
options: {
specs: 'spec/**/*.spec.js'
}
},
browserAMD: {
src: ['src/Foo.js'],
options: {
specs: 'spec/**/*.spec.js',
template: require('grunt-template-jasmine-requirejs')
}
}
},
jasmine_node: {
specNameMatcher: 'spec',
projectRoot: 'spec/'
}
});
我的jasmine规范文件现在支持UMD:
(function (root, factory) {
if (typeof module === 'object' && module.exports) {
// Node/CommonJS
factory(
require('modulename')
);
} else if (typeof define === 'function' && define.amd) {
// AMD
define([
'modulename'
], factory);
} else {
// Browser globals
factory(root.ModuleName);
}
}(this, function factory(ModuleName) {
// Tests here
}));
这是我用于模块的UMD工厂:
(function (root, factory) {
if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = factory();
} else if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(factory);
} else {
// Browser globals
root.ModuleName = factory();
}
}(this, function factory() {
// public API
return {
foo: 'bar'
};
}));
在使用时,您还可以从所有模块中的所有UMD样板文件中使用并保存您自己
您只需编写普通AMD或普通CommonJS模块(或两者的混合)并通过简单的命令转换为UMD(或在CLI或中运行的rjs优化的组合.js
,在节点上运行)
产生的UMD基于众所周知的模板,例如,通过各种调整,其中之一就是您可以
然后,您可以将普通AMD或commonJS规范转换为UMD和/或“combined.js”,并在浏览器或grunt mocha中同时点击。请参阅,以了解许多琐碎和更高级的示例