AMD の仕様では、「JSファイルのリストを順番通りに読み込み/実行する」 ということができない。実際何が困ったかというと、分割した mocha テストケースを順番通りに実行できなくなったということ。結果は変わらなくても、 順番通りに実行されないと結果が見辛いし、問題が起こった時に発見が難しい。
たしかにテストケースは毎回同じ順番に並べたいですね。 実はorderプラグインというのがあって簡単にロード順を制御できたのですが、RequireJS 2.0からはshimがあるんだからそれ使え!っていうことでサポートされなくなってしまいました。そのかわり、stepプラグインで若干設定が面倒ですが順番指定が可能です。テストの順番指定という用途であれば使えそう。
http://teppeis.hatenablog.com/entry/re-requirejs
結構古い記事だけど、最近読んだので、僕がやっていることを書いてみようかなと思った。Connpass では Require.js ばりばり使っていて、ユニットテストもそこそこ書いています。 mocha はいろいろAPIがよかったが、ブラウザ内のテストランナーがクソイので、僕達の場合は QUnitを使っています。
テストの順番の問題は確かにあったけど、すぐ解決したので、特に面倒と感じてなかった。テストの
順番を保証するために、 runTests()
というメソッドが付いているオブジェクトを
各テストモジュールで返しています。コードで書いてみるとこんな感じ。
define(["jquery"], function ($) {
return {
runTests: function () {
module("test/module");
test("Test 1", function () {
// Test Code here
});
test("Test 2", function () {
// Test Code here
});
// ...
},
};
});
自分がやってないけど、もし、インデントが多くて、嫌って思う人は簡単にラッパー作れるはず。
function testmod(mod) {
return function() {
var self = this;
var depends = arguments;
return {
runTests: function() {
mod.apply(self, depends);
}
}
};
}
define(["jquery"], testmod(function($) {
module("test/module");
test(/* ... */);
// ...
});
順番保証は、テストランナーの html ファイルでやっています。
それぞれのテストモジュールを読み込んで、 runTests()
を呼び出しています。こうすると、requireする順番で実行される。
<script>
QUnit.config.autostart = false;
QUnit.config.testTimeout = 30000; // 30 Seconds
require([
// 順番保証
"testmod1",
"testmod2",
], function () {
QUnit.start();
for (i = 0; i < arguments.length; i++) {
TestModule = arguments[i];
TestModule.runTests();
}
});
</script>