有没有一种方法可以在Jest的同一测试文件中测试模拟的功能,然后测试实际的功能?

时间:2019-05-28 19:12:04

标签: reactjs redux react-redux jestjs

在同一测试文件中,我需要测试实际的redux动作创建者,然后再测试是否从另一个函数调用了相同的动作创建者。

如果我jest.mock无法测试实际值。如果不这样做,以后就无法嘲弄它。 我也尝试过将jest.spyOnmockImplementation一起使用,但似乎并没有嘲笑它。

// actionsOne.js
export const myActionOne = ({
  type: 'MY_ACTION_ONE'
})

// test.js
import { dispatch } from './reduxStore.js'
import { myActionOne } from './actionsOne.js'
import { myActionTwo } from './actionsTwo.js'

jest.mock('./actionsOne.js', () => ({
  myActionOne: jest.fn()
}))

test('expectation 1', () => {
  // would pass if no mocking is in place. fail otherwise.
  expect(dispatch(myActionOne())).toEqual({
    type: 'MY_ACTION_ONE'
  })
})

test('expectation 2', () => {
  dispatch(myActionTwo()) // say this would also dispatch myActionOne somewhere
  // would pass if mocking is in place. fail otherwise.
  expect(myActionOne).toHaveBeenCalled()
})

因为myActionOne在分发时会做很多事情,所以我想对myActionTwo进行一次测试,只需检查它是否被调用即可。

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我可以使用jest.requireActual()来工作:

test('expectation 1', () => {
  const { myActionOne: myActionOneActual } = jest.requireActual('./actionsOne.js')

  expect(dispatch(myActionOneActual())).toEqual({
    type: 'MY_ACTION_ONE'
  })
})

期望1 通过是因为我们使用 actual 函数进行断言。

期望2 没有任何更改,因为它使用了模拟函数进行断言。