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

最終的に、ブラウザー グローバル テストとブラウザー AMD テストには grunt-contrib-jasmine を使用し、CommonJS テストには jasmine_node を使用して、ハイブリッド タスクを使用することにしました。3 つのモジュール タイプ テストをすべてサポートするスペック ファイルは 1 つしかありません。

これが私のうなり声の設定です:

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 に答える