UMD的Grunt测试

时间:2013-06-05 12:54:30

标签: javascript node.js requirejs jasmine gruntjs

我正在尝试找出使用UMD工厂测试Javascript模块定义的最佳方法,类似于:https://github.com/umdjs/umd/blob/master/returnExportsGlobal.js

我不想测试模块本身,我想在各种环境中测试模块是否“正确导出/创建”:

  1. 如果是CommonJS(节点),模块是否正确导出?
  2. 如果是AMD,是否正确定义了?
  3. 如果浏览器(没有requirejs),是否创建了正确的全局?
  4. 我想使用grunt和jasmine运行这些测试。我可以使用grunt-contrib-jasmine来测试第2点和第3点,但不是第1点。

    我想我可以使用grunt-contrib-jasmine和grunt-jasmine-node的混合来测试正确的模块定义(具体实现我还需要弄清楚),但感觉非常混乱。

    在较高的层面上,有没有人知道任何现有的方法来实现这一点而不使用多个grunt插件?

2 个答案:

答案 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