10

私が取り組んでいるプロジェクトでは、JavaScriptライブラリの寄せ集めを使用しています。私のコードのメインロジックは、複数のcommonjsモジュールに分割されています。私はグーグルクロージャーを使用して、モジュールをAngularJSアプリケーション内で使用する1つの出力jsファイルに結合します。

私が抱えている問題は、testacularでテストを実行しようとしていることです。私が受け取るエラーはですUncaught ReferenceError: require is not defined。これは、googleクロージャーとは異なり、testacularがcommonjsモジュールを理解しないために発生しています。いくつかの回避策がありますが、コードを再構築せずに機能させることを望んでいました。

  1. commonjsを使用しないように、モジュールを再構築できます。一歩後退したような気がするので、私はこれが好きではありません。コードをモジュール化したい。
  2. 私はグーグルクロージャーからコンパイルされたjsでtestacularを実行することができます。このようにしてもかまいませんが、ファイルの変更を処理するためにすべてをトリガーすることはできませんでした。Testacularはファイルの変更時にそれ自体を再実行できますが、変更時にgoogleクロージャーを再コンパイルする方法はとにかく見ていません。
  3. 最後に、testacularでcommonjsモジュールを有効にできます。理想的にはこれが私が行きたい方法ですが、それは最も簡単ではないかもしれません。

他の誰かが同様の問題に遭遇しましたか?私はさまざまなことを試してみることを心がけています。私はただハッキーなものは欲しくない。

javaclassstreamreader.spec.js:

"use strict"

var JavaClassStreamReader = require('../javaclassstreamreader.js').JavaClassStreamReader;

describe('javaclassstreamreader', function() {

  it('reader can be constructed', function() {
    var dataView = {
      byteLength : 0
    };
    //FIXME load dataView

    var reader = new JavaClassStreamReader(dataView);
    expect(reader.dataView).toBe(dataView);
    expect(reader.offset).toBe(0);
    expect(reader.maxOffset).toBe(0);
  });

});

javaclassstreamreader.js:

function JavaClassStreamReader(dataView, initialOffset, maxBytesToRead) {
  this.dataView = dataView;
  this.offset = initialOffset || 0;
  this.maxOffset = this.offset + (maxBytesToRead || this.dataView.byteLength);
}
//... code trucated ...
4

2 に答える 2

2

Testacularに問題がある/あったようです。

次のことを試してください。

  • npmキャッシュをクリアします:npm cache clean
  • testacularの別のバージョンをインストールします。npm install -g testacular@0.5.6
于 2013-01-01T19:52:30.267 に答える
1

で動作させることはできませんでしたrequireが、部分的な解決策はあります。

grunt.js:

/*global module:false*/
module.exports = function(grunt) {"use strict";

  // Project configuration.
  grunt.initConfig({
    pkg : '<json:package.json>',
    meta : {
      banner : '/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %>\n' + '<%= pkg.homepage ? "* " + pkg.homepage + "\n" : "" %>' + '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' + ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */'
    },
    lint : {
      files : ['grunt.js', 'src/*.js', 'src/public/js/**/*.js', 'src/specs/**/*.js']
    },
    watch : {
      files : '<config:lint.files>',
      tasks : 'default'
    },
    exec : {
      ensure_generated_directory : {
        command : 'mkdir -p generated/js/'
      }
    },
    clean : {
      all : ['generated']
    },
    jshint : {
      files : '<config:lint.files>',
      options : {
        curly : true,
        eqeqeq : true,
        forin : true,
        immed : true,
        latedef : true,
        newcap : true,
        noarg : true,
        sub : true,
        undef : true,
        unused : true,
        strict : true,
        boss : true,
        eqnull : true,
        es5 : true,
        browser : true,
        jquery : true,
        devel : true
      },
      globals : {
        //jasmine
        describe : false,
        it : false,
        expect : false,
        //commonjs
        require : false,
        exports : true,
        //angular
        angular : false
      }
    },
    'closure-compiler' : {
      frontend : {
        closurePath : 'closure-compiler',
        js : ['src/*.js', 'src/public/js/**/*.js'],
        jsOutputFile : 'generated/js/complete-app.js',
        options : {
          externs : 'externs.js',
          compilation_level : 'SIMPLE_OPTIMIZATIONS',
          language_in : 'ECMASCRIPT5_STRICT',
          logging_level : 'ALL',
          debug : null,
          warning_level : 'verbose',
          summary_detail_level : 3,
          formatting : ['PRETTY_PRINT', 'PRINT_INPUT_DELIMITER'],
          common_js_entry_module : 'src/public/js/app.js',
          process_common_js_modules : null,
          process_jquery_primitives : null,
          common_js_module_path_prefix : 'src'
        }
      }
    },
    testacularServer : {
      integration : {
        options : {
          keepalive : true
        },
        configFile : 'testacular.conf.js',
        autoWatch : false,
        singleRun : true
      }
    }
  }); 

  // Default task.
  grunt.registerTask('default', 'lint exec:ensure_generated_directory closure-compiler testacularServer:integration');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-closure-compiler');
  grunt.loadNpmTasks('grunt-exec');
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-testacular');
};

実行grunt watchでき、同様の結果が得られます。不機嫌そうなlints、コンパイル、そしてtestacularを実行します。これは私が望んでいたほど速くはありません。testacularは、毎回サーバーを起動および停止します。

于 2013-01-08T03:27:27.920 に答える