Stub模块函数从同一个模块调用

Sim*_*mon 10 node.js

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

myModule.js:

'use strict'

function foo () {
  return 'foo'
}

exports.foo = foo

function bar () {
  return foo()
}

exports.bar = bar
Run Code Online (Sandbox Code Playgroud)

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
      })
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

这让我想起了Java静态函数,这些函数不是一成不变的(几乎).

知道如何实现我想做的事情吗?我知道foo在不同的模块中提取会起作用,但这不是我在这里要做的.我也知道,调用foobar方法与关键字this也将工作,我转向使用的困惑this 在这方面(因为我没有使用OOP).

Dav*_*mit 9

我刚试过这个.它就像魅力一样.

'use strict'

function foo () {
  return 'foo';
}

exports.foo = foo;

function bar () {
  return exports.foo(); // <--- notice
}

exports.bar = bar;
Run Code Online (Sandbox Code Playgroud)

说明

当你做sinon.stub(myModule, 'foo').returns('foo2')那么sinon存根的exported对象是foo不是真正foo从内部运作的myModule.js......因为你必须知道,foo在访问从模块外.因此,当您设置时exports.foo,导出的对象exports.foo存储ref的foo.而当你打电话时sinon.stub(myModule, 'foo').returns('foo2'),sinon将存根exports.foo而不是实际foo

希望这是有道理的!