首页 > 解决方案 > 测试以查看事件是否以开玩笑的方式运行

问题描述

我试图想出一个场景来实际测试事件是否正在运行。我的大脑是这样工作的。我注册了一个监听器,我期待 spy 被调用,但不是吗?

const EventEmitter = require('events')
const ee = new EventEmitter()

describe('Event Emitter', () => {
  it('Emit Listener', () => {
    ee.on('test', function() {})   
    const spy = jest.spyOn(ee, 'on')

    ee.emit('test')
    expect(spy).toHaveBeenCalledTimes(1)
  })
})

标签: eventsjestjsevent-handling

解决方案


jest.spyOn(ee, 'on')设置一个可以测试ee.on(...)之后是否被调用的间谍。因为不是,所以测试失败。间谍不可能追溯。相反,它应该在调用之前设置:

const spy = jest.spyOn(ee, 'on')
ee.on('test', function() {})   

expect(spy).toHaveBeenCalledTimes(1)
expect(spy).toHaveBeenCalledWith(expect.any(Function))

或者如果目标是测试事件,它应该是:

const spy = jest.fn()
ee.on('test', spy)
ee.emit('test')

expect(spy).toHaveBeenCalledTimes(1)

推荐阅读