Javascript UMD的Grunt测试

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

我正试图找出使用UMD工厂测试Javascript模块定义的最佳方法,类似于:

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

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

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


    在较高的层次上,有人知道有没有任何现有的方法可以在不使用多个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中同时点击。请参阅,以了解许多琐碎和更高级的示例