如何在内部调用的模块中存根/窥探外部方法?
//entity module function isUnique(name) { return true; } exports.isUnique = isUnique; function create(name) { if (isUnique(name)) { return console.log(name); } else { return new Error(); } } exports.create = create;
是否有可能残留“isUnique”方法来改变“创build”方法的行为?
var entity = require("./entity"); var sinon = require("sinon"); var assert = require("assert"); var stub = sinon.stub(entity, "isUnique", function (name) { return false }); entity.create("test"); stub.restore(); assert(stub.calledOnce, true);
总之:没有。
你的模块持有对isUnique
函数的两个引用:一个来自函数声明本身,另一个来自isUnique
。
create
函数使用第一个,但是Sinon是第二个。
为了让存根被调用, create
需要使用存根被引用的引用:
if (exports.isUnique(name)) { return console.log(name); } // `this.isUnique` also works, because `this` === `module.exports`
或者,你可以使用像rewire
这样的模块。