我正在尝试找出使用UMD工厂测试Javascript模块定义的最佳方法,类似于:https://github.com/umdjs/umd/blob/master/returnExportsGlobal.js
我不想测试模块本身,我想在各种环境中测试模块是否“正确导出/创建”:
我想使用grunt和jasmine运行这些测试。我可以使用grunt-contrib-jasmine来测试第2点和第3点,但不是第1点。
我想我可以使用grunt-contrib-jasmine和grunt-jasmine-node的混合来测试正确的模块定义(具体实现我还需要弄清楚),但感觉非常混乱。
在较高的层面上,有没有人知道任何现有的方法来实现这一点而不使用多个grunt插件?
答案 0 :(得分:4)
最后,我决定使用混合任务,使用grunt-contrib-jasmine进行浏览器全局和浏览器AMD测试,使用jasmine_node进行CommonJS测试。我只有一个规格 支持所有3种模块类型测试的文件。
这是我的咕噜声配置:
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 spec文件现在支持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'
};
}));
答案 1 :(得分:0)
您还可以使用uRequire并使用declarative features从所有模块中的所有UMD样板中保存自己。
您只需编写普通的AMD或普通的CommonJS模块(或两者的混合)并转换为UMD(或在 nodejs 上按原样运行的rjs优化combined.js
, Web / AMD & Web /脚本),在CLI或build step and config中使用简单的grunt。
制作的UMD基于众所周知的模板,例如https://github.com/umdjs/umd/blob/master/returnExportsGlobal.js,并进行了各种调整,其中一个是declaratively export to window
/global
。
然后,您可以将普通的AMD或commonJS规范转换为UMD和/或'combined.js',并在浏览器或grunt-mocha中同时使用。有关许多简单且更高级的示例,请参阅uBerscore。