繁体   English   中英

从同一个模块调用存根模块功能

[英]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会起作用,但这不是我在这里尝试做的。 我也知道,调用foobar法关键字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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM