2

我目前是第一次在 jest 和 nodejs 中介绍自己。我面临的问题是我必须从 nodejs 配置中模拟两个不同的值。

jest.mock('config')
mockConfigTtl = require('config').get.mockReturnValue(100);
mockConfigScheduling = require('config').get.mockReturnValue('* * * * *');

问题是第二个 mockReturnValue 覆盖了第一个。有没有可能将展位模拟彼此分开?

也许有类似的东西:

jest.mock('config')
mockConfigTtl = require('config').get('firstKey').mockReturnValue(100);
mockConfigScheduling = require('config').get('secondKey').mockReturnValue('* * * * *');
4

1 回答 1

2

由于您希望确保您的实现适用于所有可能的配置,我认为最好在不同的描述块中设置多个测试场景,并在每个测试场景中使用mockReturnValue并执行您的实现。

例子:

const config = require('config');

jest.mock('config')

describe('my implementation', () => {
  describe('with firstKey 100', () => {
    let result
    beforeAll(() => {
      config.get.mockReturnValue(100)
      result = myImplementation()
    })

    it('should result in ...', () => {
      // your assertion here
    })
  })

  describe('with firstKey different than 100', () => {
    let result
    beforeAll(() => {
      config.get.mockReturnValue(1000)
      result = myImplementation()
    })

    it('should result in ...', () => {
      // your assertion here
    })
  })
})

或者如果您想测试更多配置,您可以使用describe.each

const config = require('config');

jest.mock('config')

describe('my implementation', () => {
  describe.each([
    100,
    200,
    300
  ])('with firstKey: %d', (firstKey) => {
    let result
    beforeAll(() => {
      config.get.mockReturnValue(firstKey)
      result = myImplementation()
    })

    it('should match the snapshot',  () => {
      expect(result).toMatchSnapshot()
    })
  })
})

这将生成一个带有您的实现结果的快照,如果它发生更改,除非更新快照,否则测试将失败

于 2020-11-13T10:57:30.427 回答