从同一模块调用的存根模块function

我不能找出一种方法来存储在同一个模块中调用的函数,这个函数被定义了(存根似乎不工作)。 这是一个例子:

myModule.js:

'use strict' function foo () { return 'foo' } exports.foo = foo function bar () { return foo() } exports.bar = bar 

myModule.test.js:

 'use strict' const chai = require('chai') const sinon = require('sinon') chai.should() const myModule = require('./myModule') describe('myModule', () => { describe('bar', () => { it('should return foo', () => { myModule.bar().should.equal('foo') // succeeds }) describe('when stubbed', () => { before(() => { sinon.stub(myModule, 'foo').returns('foo2') // this stub seems ignored }) it('should return foo2', () => { myModule.bar().should.equal('foo2') // fails }) }) }) }) 

这让我想起了Java静态函数,它们几乎是不可碎的。

任何想法如何实现我想要做的? 我知道在不同的模块中提取foo将起作用,但这不是我在这里要做的。 我也知道,在关键字this中调用foobar方法也会起作用,在这种情况下,我对这个用法感到困惑(因为我没有使用OOP)。

       

网上收集的解决方案 "从同一模块调用的存根模块function"

我只是testing了这一点。 它的作用就像魅力。

 'use strict' function foo () { return 'foo'; } exports.foo = foo; function bar () { return exports.foo(); } exports.bar = bar; 

说明

当你执行sinon.stub(myModule, 'foo').returns('foo2') sinon exported对象的foomyModule.js ,而不是真正的foo函数……正如你必须知道的那样, foo是可访问的从模块外部。 所以当你设置exports.foo ,导出的对象exports.foo存储了foo的ref。 当你调用sinon.stub(myModule, 'foo').returns('foo2')sinon会存根sinon而不是实际的foo

希望这是有道理的!