使用 Chutzpah 测试 duktape 中使用的 CommonJS 模块

Using Chutzpah to test CommonJS modules used in duktape

我在游戏引擎(Atomic Game Engine) which uses the Duktape embeddable javascript engine. This allows loading of CommonJS 模块中工作,所以我有如下模块:

require("Scripts/LumaJS/Interface");

// Interface to be implemented by state objects
var IState = new Interface({
    optional: ["onEnter", "onExit", "onUpdate"],
    reserved: ["label"]
});

StateMachine = function(onStateChanged) {
    this.states = {};
    this.currentState = null;
    this.onStateChanged = onStateChanged;
    this.log = false;
}

StateMachine.prototype.addState = function (label, stateOrOnEnter, onExit, onUpdate) {
    // Support objects or individual functions
    var state;
    if (!stateOrOnEnter ||
        typeof (stateOrOnEnter) == "function") {
        state = {
            onEnter: stateOrOnEnter,
            onExit: onExit,
            onUpdate: onUpdate
        };
    } else {
        state = stateOrOnEnter;
    }

    // Validate and add
    IState.throwIfNotImplementedBy(state);
    state.label = label;
    this.states[label] = state;
}

StateMachine.prototype.getCurrentStateLabel = function() {
    return this.currentState ? this.currentState.label : null;
}

// Many more class functions..

exports.create = function (onStateChanged) {
    return new StateMachine(onStateChanged);
}

我已将 Chutzpah 设置为在 VS 社区版(使用 qunit)中进行单元测试。测试不使用 require 函数或导出对象的东西是可以的,测试上面的模块如下:

/// <reference path="..\Resources\Scripts\LumaJS\stateMachine.js" />

test("starts with no state", function() {
    var stateMachine = new StateMachine();

    equals(stateMachine.getCurrentStateLabel(), null);
});

Chutzpa 失败并出现 "Can't find variable" 错误。

我通过在 fakeJSCommon.js 中添加以下内容来解决这个问题,然后我从测试文件中引用它:

require = function () { }
exports = {};

但是我还需要手动引用我正在测试的模块的需求,这似乎并不理想。

所以我的问题是:有没有办法让 Chutzpah 像参考标签一样处理 requires,或者有更好的方法来实现我正在寻找的东西?

Chutzpah 只是在浏览器中运行您的代码,因此您引用的任何内容都必须有效 javascript 才能加载。如果您使用的方法是 "magic" 并且没有真正的定义,那么 Chutzpah 将失败。我认为你最好的选择是有一个垫片(就像你做的那样)来防止 Chutzpah 在声明中出错。然后添加一个 chutzpah.json 文件来声明您的引用。