如何在内部调用的模块中存根/窥探外部方法?

//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这样的模块。