node.jsでdocument/window依存なスクリプトをグダる (2)

2013-01-14T00:00:00+00:00 JavaScript Node.js

node-jqueryがwindowなグローバルがあればXMLHttpRequestをロードしてくれるっていう事実が発覚したのですが

それは置いといて、node vm contextな扱いとかでrunnerなJS作ってnode.jsでjQueryを扱うテストとか色々出来ないかなーっと模索しているのですが、とりあえずやってみた(但し、QUnitとか除外)

var fs = require("fs"),
    vm = require("vm"),
    path = require("path"),
    wrench = require("wrench"),
    jsdom = require("jsdom"),
    jQuery = require("jquery");

var doc = jsdom.jsdom(
  "<html><head><title>fuga</title><body></body></html>",
  null,
  {}
);

global.$ = jQuery;

var rootContext = vm.createContext({
  "require": require,
  "module": module,
  "console": console,
  "global": {},
  "document": doc,
  "window": doc.createWindow()
});

var root = path.resolve("tests");
wrench.readdirSyncRecursive(root).forEach(function(testTarget) {
  var testTargetFilename = path.join(root, testTarget);
  var stat = fs.lstatSync(testTargetFilename);

  if (stat.isDirectory()) {
    return;
  }

  var testTargetData = fs.readFileSync(testTargetFilename, "utf-8");

  vm.runInContext(testTargetData, rootContext, testTargetFilename);
});

実際に呼び出すJSなファイルからのコンテキストはvm.createContextで指定するキー指定で利用できる模様げだけど、そこから更にrequireした際にはglobalな所に突っ込んでおかないと参照出来ねーよと怒られる模様げで

あと前に書くの忘れたけど、jQueryとnode-jQueryでは$で参照するエレメントの型が異なるので、テスト対象とするライブラリなJSで$参照の引数をチェックする場合には結構問題になって動かないっていう事になったりする

mongodbを使ってみる (2) - operators - node.jsでdocument/window依存なスクリプトをグダる