6

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

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

  1. 如果是 CommonJS(节点),模块是否正确导出?
  2. 如果是 AMD,它的定义是否正确?
  3. 如果浏览器(没有 requirejs),是否创建了正确的全局?

我想使用 grunt 和 jasmine 运行这些测试。我可以使用 grunt-contrib-jasmine 来测试第 2 点和第 3 点,但不能测试第 1 点。

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

在高层次上,有没有人知道任何现有的方法可以在不使用多个 grunt 插件的情况下实现这一目标?

4

2 回答 2

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 规范文件现在支持 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'
  };
}));
于 2013-06-06T22:37:25.393 回答
0

您还可以使用uRequire并从所有模块中的所有 UMD 样板中保存您自己,同时使用声明性功能

您只需编写普通的 AMD 或普通的 CommonJS 模块(或两者的混合),然后通过简单的构建步骤和配置转换为 UMD(或在nodejsWeb/AMDWeb/Scriptcombined.js上按原样运行的 rjs 优化) ,或者在 CLI 或grunt中。

生成的 UMD 基于众所周知的模板,例如https://github.com/umdjs/umd/blob/master/templates/returnExportsGlobal.js,并进行了各种调整,其中之一是您可以以声明方式导出到window/global

然后,您可以将普通的 AMD 或 commonJS 规范转换为 UMD 和/或“combined.js”,并在浏览器或 grunt-mocha 中同时点击。有关许多琐碎和更高级的示例,请参见uBerscore

于 2013-12-24T11:52:12.060 回答