呼叫同一模組中的存根模組函數
P粉596161915
P粉596161915 2023-11-03 13:47:45
0
2
733

我無法找到一種方法來存根從該函數定義的相同模組中呼叫的函數(存根似乎不起作用)。這是一個例子:

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)。

P粉596161915
P粉596161915

全部回覆(2)
P粉099000044

我對使用exports 有點謹慎,因為它有點神奇(例如,當你在Typescript 中編碼時,你從不直接使用它),所以我想提出一個替代方案解決方案,不幸的是仍然需要修改原始程式碼,只是將要存根的函數包裝到物件中:

export const fooWrapper = {
    foo() {...}
}

function bar () {
    return fooWrapper.foo()
}

sinon.stub(fooWrapper, 'foo')。只為了測試而必須這樣包裝有點遺憾,但至少它在 Typescript 中是顯式的且類型安全的(與輸入為 anyexports 相反)。

P粉797855790

我剛剛測試了這個。它就像魅力一樣起作用。

'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 會存根導出物件的foo 並不是myModule.js 中實際的foo 函數...正如你必須知道的那樣,foo 是可從模組外部訪問。因此,當您設定 exports.foo 時,匯出的物件 exports.foo 會儲存 foo 的 ref。當您呼叫sinon.stub(myModule, 'foo').returns('foo2') 時,sinon 將存根exports.foo 並不是實際的foo

希望這是有道理的!

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板