suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Rufen Sie eine Stub-Modulfunktion im selben Modul auf

Ich kann keine Möglichkeit finden, eine Funktion zu unterbrechen, die von demselben Modul aufgerufen wird, in dem die Funktion definiert ist (das Stubbing scheint nicht zu funktionieren). Hier ist ein Beispiel:

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

Das erinnert mich an statische Java-Funktionen, die (fast) nicht stubar sind.

Irgendeine Idee, wie ich das erreichen kann, was ich tun möchte? Ich weiß, dass es verwirrend ist, foo 会起作用,但这不是我在这里想要做的。我还知道,在 bar 方法中使用关键字 this 调用 foo 也会起作用,我对在这种情况下使用 ̀this in verschiedenen Modulen zu extrahieren (da ich kein OOP verwende).

P粉596161915P粉596161915394 Tage vor706

Antworte allen(2)Ich werde antworten

  • P粉099000044

    P粉0990000442023-11-04 11:50:52

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

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

    sinon.stub(fooWrapper, 'foo')。只为了测试而必须这样包装有点遗憾,但至少它在 Typescript 中是显式的且类型安全的(与输入为 anyexports 相反)。< /p>

    Antwort
    0
  • P粉797855790

    P粉7978557902023-11-04 00:12:56

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

    '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

    希望这是有道理的!

    Antwort
    0
  • StornierenAntwort