[英]Stub module function called from the same module
我想不出一种方法来对从定义此函数的同一模块中调用的函数进行存根(存根似乎不起作用)。 这是一个例子:
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
会起作用,但这不是我在这里尝试做的。 我也知道,调用foo
在bar
法关键字this
也将工作,我转向使用的疑惑this
在这种情况下(因为我没有使用OOP)。
我刚刚测试过。 它就像魅力。
'use strict'
function foo () {
return 'foo';
}
exports.foo = foo;
function bar () {
return exports.foo(); // <--- notice
}
exports.bar = bar;
说明
当你做sinon.stub(myModule, 'foo').returns('foo2')
然后sinon
存根的exported
对象的foo
不是实际foo
从内部功能myModule.js
......因为你必须知道, foo
是在访问从模块外部。 因此,当您设置exports.foo
,导出的对象exports.foo
存储了foo
的引用。 当你调用sinon.stub(myModule, 'foo').returns('foo2')
sinon
将存根exports.foo
而不是实际的foo
希望这有道理!
我有点担心使用exports
因为它有点神奇(例如,当您在Typescript中编码时,您永远不会直接使用它),因此我想提出一个替代解决方案,不幸的是,该解决方案仍然需要修改源代码,而这仅仅是将要存根的函数包装到对象中:
export const fooWrapper = {
foo() {...}
}
function bar () {
return fooWrapper.foo()
}
还有sinon.stub(fooWrapper, 'foo')
。 只为测试而不得不像这样包装有点可惜,但至少它是显式的,并且在Typescript中是安全的(与输入any
exports
相反)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.