首页 文章

UMD的Grunt测试

提问于
浏览
6

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

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

  • 如果是CommonJS(节点),模块是否正确导出?

  • 如果AMD,是否正确定义?

  • 如果浏览器(没有requirejs),是否创建了正确的全局?

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

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

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

2 回答

  • 4

    最后,我决定使用混合任务,使用grunt-contrib-jasmine进行浏览器全局和浏览器AMD测试,使用jasmine_node进行CommonJS测试 . 我只有一个支持所有3个模块类型测试的spec文件 .

    这是我的咕噜配置:

    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'
      };
    }));
    
  • 0

    您还可以使用uRequire并从所有模块中的所有UMD样板中保存自己,同时使用declarative features .

    您只需编写普通的AMD或普通的CommonJS模块(或两者的混合),并在CLI或grunt中使用简单的build step and config转换为UMD(或在 nodejsWeb/AMDWeb/Script 上按原样运行的rjs优化 combined.js ) .

    制作的UMD基于众所周知的模板,如https://github.com/umdjs/umd/blob/master/returnExportsGlobal.js,有各种调整,其中一个就是你可以declaratively export to window/global .

    然后,您可以将普通的AMD或commonJS规范转换为UMD和/或'combined.js',并在浏览器或grunt-mocha中同时命中 . 有关许多简单且更高级的示例,请参阅uBerscore .

相关问题