【问题标题】:Stub module function called from the same module从同一模块调用的存根模块函数
【发布时间】:2016-03-02 17:10:30
【问题描述】:

我无法找到一种方法来存根从定义该函数的同一模块中调用的函数(存根似乎不起作用)。这是一个例子:

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 会起作用,但这不是我在这里想要做的。我也知道在 bar 方法中使用关键字 this 调用 foo 也可以,我对在这种情况下使用 ̀this 感到困惑(因为我没有使用 OOP) .

【问题讨论】:

    标签: node.js


    【解决方案1】:

    我刚刚测试了这个。它就像魅力一样。

    '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 内部的实际foo 函数...您必须知道,foo 可以从模块外。所以当你设置exports.foo时,导出的对象exports.foo存储了foo的ref。当您调用sinon.stub(myModule, 'foo').returns('foo2') 时,sinon 将存根exports.foo 而不是实际的foo

    希望这是有道理的!

    【讨论】:

    • 太好了,谢谢。使用exports 还是有点难看,因为它和this 做的工作有点像,但也可以。在静态环境中使用this 让我有点吃惊。
    • 这是一种hacky方式,我们不应该修改原始代码来测试它。有什么想法吗?
    • @GuidoDizioli 我同意,但还没有找到其他方法。你有吗?
    【解决方案2】:

    我对使用 exports 有点谨慎,因为它有点神奇(例如,当你在 Typescript 中编码时,你从不直接使用它),所以我想提出一个替代解决方案,它仍然需要不幸的是修改了源代码,这只是将要存根的函数包装到一个对象中:

    export const fooWrapper = {
        foo() {...}
    }
    
    function bar () {
        return fooWrapper.foo()
    }
    

    还有sinon.stub(fooWrapper, 'foo')。不得不像这样包装只是为了测试有点可惜,但至少它是明确的并且在 Typescript 中是类型安全的(与 exports 类型相反,any 类型)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多