2013-06-24 4 views
16

私は、CommonJS構文で記述された角度アプリケーションで作業しています。grunt-contrib-requirejsタスクでgruntタスクを使用して、ソースファイルをAMDフォーマットに変換してコンパイルしますそれを1つの出力ファイルにまとめます。私の目標はKarmaをRequireJSで動作させ、ソースファイルとスペックファイルをCommonJS構文で保持することです。KarmaとRequireJSでCommonJS構文でファイルをテストする

私は、次のファイル構造とAMD形式で渡して簡単なテストを得ることができました:

-- karma-test 
    |-- spec 
    | `-- exampleSpec.js 
    |-- src 
    | `-- example.js 
    |-- karma.conf.js 
    `-- test-main.js 

と、次のファイル:

karma.conf.js

// base path, that will be used to resolve files and exclude 
basePath = ''; 

// list of files/patterns to load in the browser 
files = [ 
    JASMINE, 
    JASMINE_ADAPTER, 
    REQUIRE, 
    REQUIRE_ADAPTER, 
    'test-main.js', 
    {pattern: 'src/*.js', included: false}, 
    {pattern: 'spec/*.js', included: false} 
]; 

// list of files to exclude 
exclude = []; 

// test results reporter to use 
// possible values: 'dots', 'progress', 'junit' 
reporters = ['progress']; 

// web server port 
port = 9876; 

// cli runner port 
runnerPort = 9100; 

// enable/disable colors in the output (reporters and logs) 
colors = true; 

// level of logging 
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG 
logLevel = LOG_DEBUG; 

// enable/disable watching file and executing tests whenever any file changes 
autoWatch = true; 

// Start these browsers, currently available: 
browsers = ['Chrome']; 

// If browser does not capture in given timeout [ms], kill it 
captureTimeout = 60000; 

// Continuous Integration mode 
// if true, it capture browsers, run tests and exit 
singleRun = false; 
例。
define('example', function() { 
    var message = "Hello!"; 

    return { 
     message: message 
    }; 
}); 

exampleSpec.js

define(['example'], function(example) { 
    describe("Example", function() { 
     it("should have a message equal to 'Hello!'", function() { 
      expect(example.message).toBe('Hello!'); 
     }); 
    }); 
}); 

テストmain.js

var tests = Object.keys(window.__karma__.files).filter(function (file) { 
     return /Spec\.js$/.test(file); 
}); 

requirejs.config({ 
    // Karma serves files from '/base' 
    baseUrl: '/base/src', 

    // Translate CommonJS to AMD 
    cjsTranslate: true, 

    // ask Require.js to load these files (all our tests) 
    deps: tests, 

    // start test run, once Require.js is done 
    callback: window.__karma__.start 
}); 

しかし、私の目標は、ソースファイルとでspecファイルの両方を記述することです同じ結果を持つCommonJS構文:

example.js

var message = "Hello!"; 

module.exports = { 
    message: message 
}; 

exampleSpec.js

var example = require('example'); 

describe("Example", function() { 
    it("should have a message equal to 'Hello!'", function() { 
     expect(example.message).toBe('Hello!'); 
    }); 
}); 

しかしtrueに設定cjsTranslateフラグを持つにもかかわらず、私はこのエラーが表示されます。

Uncaught Error: Module name "example" has not been loaded yet for context: _. Use require([]) 
http://requirejs.org/docs/errors.html#notloaded 
at http://localhost:9876/adapter/lib/require.js?1371450058000:1746 

どのようにこれを達成することができますか?


編集:私はカルマランナーのレポのために、この問題が見つかりました:https://github.com/karma-runner/karma/issues/552をして、この問題に役立つかもしれないいくつかのコメントがありますが、私はこれまで彼らと任意の運を持っていませんでした。

答えて

11

解決方法は、gruntを使用して関与し、カスタムの面倒な作業を書くことになりました。このプロセスは次のようになります:

ファイルパターンを使用してすべての仕様を検索し、それらをループし、従来のAMDスタイルのrequireブロックを構築し、このようなコードで一時ファイルを作成することによって、ブートストラップrequirejsファイルを構築します:

require(['spec/example1_spec.js' 
,'spec/example2_spec.js', 
,'spec/example3_spec.js' 
],function(a1,a2){ 
// this space intentionally left blank 
}, "", true); 

は、上記のブートストラップファイルをコンパイルし、効果的にすべてのソースコード、仕様、およびライブラリが含まれます単一のjsファイルを出力しRequireJSイサキタスクを作成します。

requirejs: { 
     tests: { 
      options: { 
       baseUrl: './test', 
       paths: {}, // paths object for libraries 
       shim: {}, // shim object for non-AMD libraries 
       // I pulled in almond using npm 
       name: '../node_modules/almond/almond.min', 
       // This is the file we created above 
       include: 'tmp/require-tests', 
       // This is the output file that we will serve to karma 
       out: 'test/tmp/tests.js', 
       optimize: 'none', 
       // This translates commonjs syntax to AMD require blocks 
       cjsTranslate: true 
      } 
     } 
    } 

カルマサーバーを手動で起動し、テスト用に用意されているコンパイル済みのjsファイルを提供するgruntタスクを作成します。

また、私はkarma.conf.jsファイルにREQUIRE_ADAPTERを捨てることができたし、その後にのみ代わりに、すべてのソースコードや仕様にマッチしたパターンの単一のjsコンパイルしたファイルが含まれ、それは次のようになります。

// base path, that will be used to resolve files and exclude 
basePath = ''; 

// list of files/patterns to load in the browser 
files = [ 
    JASMINE, 
    JASMINE_ADAPTER, 
    REQUIRE, 
    'tmp/tests.js' 
]; 

// list of files to exclude 
exclude = []; 

// test results reporter to use 
// possible values: 'dots', 'progress', 'junit' 
reporters = ['progress']; 

// web server port 
port = 9876; 

// cli runner port 
runnerPort = 9100; 

// enable/disable colors in the output (reporters and logs) 
colors = true; 

// level of logging 
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG 
logLevel = LOG_INFO; 

// enable/disable watching file and executing tests whenever any file changes 
autoWatch = true; 

// Start these browsers, currently available: 
browsers = ['PhantomJS']; 

// If browser does not capture in given timeout [ms], kill it 
captureTimeout = 60000; 

// Continuous Integration mode 
// if true, it capture browsers, run tests and exit 
singleRun = true; 

requirejsコンパイルのgruntタスク設定では、テスト実行を開始するためにalmondを使用する必要もありました(テスト実行はそれなしでハングします)。これは上記のrequirejs gruntタスクの設定で使用されています。

1

いくつかあります。まず第一に、私はあなたの質問にいくつかの詳細を忘れたかもしれません(それは非常に巨大です) - それについては申し訳ありません。

要するに、あなたは、バックボーン・ボイラープレートwip分岐試験機関をチェックアウトすることもできます。https://github.com/backbone-boilerplate/backbone-boilerplate/tree/wip

まず:RequireJSは開封された生のcommon.jsモジュールをサポートしていません。 cjsTranslateはビルド時にCommonjsをAMD互換に変換するR.js(ビルドツール)オプションです。そのため、CJS rawモジュールを必要としません。この問題を解決するには、サーバーを使用して送信されたスクリプトをフィルタリングし、AMD形式にコンパイルします。

第二:カルマrequirejsプラグインが動作していないBBBには、我々はそれらをコンパイルするのに役立つ、静的を通じてファイルを渡しますそれは何とかrequireJSを直接使うのは簡単です。 BBBについては、これで管理しています。https://github.com/backbone-boilerplate/backbone-boilerplate/blob/wip/test/jasmine/test-runner.js#L16-L36

+0

BBBリンクが無効で、同じファイルのコミットへのリンクが変更されました:https://github.com/backbone-boilerplate/backbone-boilerplate/blob/eb172e0ac9accb16d1d46e28ac52be0bded052bb/test/runner.js – MrYellow

関連する問題