Panggil fungsi modul rintisan dalam modul yang sama
P粉596161915
P粉596161915 2023-11-03 13:47:45
0
2
725

Saya tidak dapat mencari cara untuk stub fungsi yang dipanggil dari modul yang sama di mana fungsi itu ditakrifkan (stubbing nampaknya tidak berfungsi). Berikut adalah contoh:

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

Ini mengingatkan saya kepada fungsi statik Java yang (hampir) tidak boleh berstub.

Ada idea bagaimana untuk mencapai apa yang saya mahu lakukan? Saya tahu ia mengelirukan untuk mengekstrak foo 会起作用,但这不是我在这里想要做的。我还知道,在 bar 方法中使用关键字 this 调用 foo 也会起作用,我对在这种情况下使用 ̀this dalam modul yang berbeza (kerana saya tidak menggunakan OOP).

P粉596161915
P粉596161915

membalas semua(2)
P粉099000044

Saya agak berhati-hati menggunakan exports kerana ia agak ajaib (contohnya, apabila anda kod dalam Typescript, anda tidak pernah menggunakannya secara langsung), jadi saya ingin mencadangkan penyelesaian alternatif, yang malangnya masih memerlukan pengubahsuaian kod sumber, Hanya balut fungsi yang anda ingin stub menjadi objek:

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

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

dan sinon.stub(fooWrapper, 'foo'). Agak memalukan bahawa anda perlu membungkusnya seperti ini hanya untuk ujian, tetapi sekurang-kurangnya ia jelas dan selamat jenis dalam Typescript (berbanding dengan sinon.stub(fooWrapper, 'foo')。只为了测试而必须这样包装有点遗憾,但至少它在 Typescript 中是显式的且类型安全的(与输入为 anyexports di mana input adalah mana-mana ).

P粉797855790

Saya baru sahaja menguji ini. Ia berfungsi seperti azimat.

'use strict'

function foo () {
  return 'foo';
}

exports.foo = foo;

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

exports.bar = bar;

Apabila anda melaksanakan 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

Semoga ini masuk akal!

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan