如何使用Jest模拟外部模块的函数

icomxhvb  于 2023-09-28  发布在  Jest
关注(0)|答案(2)|浏览(140)

Jest的mocking可以处理我没有编写的模块中的函数吗?
node-yelp-api-v3Yelp.searchBusiness(String),但我尝试使用Jest的模拟功能没有成功。Jest示例似乎假定我在模拟项目中的一个模块。从文档中我也不清楚如何模拟模块中的特定函数。
这两个都不起作用:

jest.mock('Yelp.searchBusiness', () => {
      return jest.fn(() => [{<stubbed_json>}])
    })

jest.mock('Yelp', () => {
      return jest.fn(() => [{<stubbed_json>}])
    })

我现在使用的是sinon,但我只想使用Jest。这种Sinon方法有效:

var chai = require('chai')
    var should = chai.should()
    var agent = require('supertest').agent(require('../../app'))

    const Yelp = require('node-yelp-api-v3')

    var sinon = require('sinon')
    var sandbox

    describe('router', function(){
      beforeEach(function(){
        sandbox = sinon.sandbox.create()
        stub = sandbox.stub(Yelp.prototype, 'searchBusiness')
      })

      afterEach(function(){
        sandbox.restore()
      })

      it ('should render index at /', (done) => {
        /* this get invokes Yelp.searchBusiness */
        agent
          .get('/')
          .end(function(err, res) {
            res.status.should.equal(200)
            res.text.should.contain('open_gyro_outline_500.jpeg')

            done()
          })
      })
    })
vxqlmq5t

vxqlmq5t1#

这里解释了模拟外部模块。
如果你模拟的模块是Node模块(例如:lodash),mock应该放在__mocks__目录中,与node_modules相邻(除非您将root配置为指向项目根目录以外的文件夹),并且将自动模拟。不需要显式调用jest.mock('module_name')
对于您的具体情况,这意味着您需要创建一个文件夹__mocks__,其中包含一个文件node-yelp-api-v3.js。在该文件中,您使用genMockFromModule从原始模块创建了一个mock对象,并覆盖了您想要mock的方法。

// __mocks__/node-yelp-api-v3.js

const yelp = jest.genMockFromModule('node-yelp-api-v3')

function searchBusiness() {
    return [{<stubbed_json>}]
}

yelp.searchBusiness = searchBusiness

module.exports = yelp

此外,如果您希望稍后为该方法调用像searchBusiness.mock.calls.length这样的Assert,您还可以将searchBusiness Package 在jest.fn中。

8iwquhpp

8iwquhpp2#

你也可以这样做:

jest.mock('Yelp', () => ({
    searchBusiness: jest.fn(() => [{<stubbed_json>}])
})

然后你就可以调用expect(Yelp.searchBusiness).toHaveBeenCalled()等东西了。

相关问题