笑话:如何在第3方窗口对象上测试事件侦听器?

时间:2018-12-03 20:54:12

标签: reactjs jestjs

我有一个名为web3的对象,可以监听事件并用于设置cookie:

import Cookies from 'universal-cookie'
import _ from 'lodash'

const cookies = new Cookies()

const setUserId = () => {
  if (_.isUndefined(window.web3)) return

  window.web3.currentProvider.publicConfigStore.on(
    'update',
    ({ selectedAddress }) => {
      cookies.set('userId', selectedAddress)
    }
  )
}

export default {
  setUserId,
}

我正在尝试进行开玩笑的测试,但我坚持要怎么做:

1)模拟Cookies

2)模拟web3.currentProvider.publicConfigStore.on('update', ...)

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

要模拟Cookies,您需要模拟导入的模块,以便它返回一个函数,该函数使用set方法(该模拟方法)返回对象。在这种情况下,您只能在JavaScript中使用函数原因,而在类和函数之间并没有真正的区别。

jest.mock('universal-cookie', ()=> jest.fn())
import Cookie from 'universal-cookie'

const setCookie = jest.fn()
Cookie.mockImplementation(()=> ({set: setCookie}))

如果您不需要检查set函数,也可以在一行中进行模拟:

jest.mock('universal-cookie', ()=> ()=> ({set: jest.fn()})

要访问全局名称空间中的任何内容,例如window,可以在玩笑中使用global关键字来访问它。在此您可以添加任何您想要的内容;

const on = jest.fn()
global.web3 = { 
  currentProvider: {
    publicConfigStore: {
      on
    }
  }
}

最后一步是使用mock.calls调用传递给on的回调

on.mock.calls[0][1]({selectedAddress: 'someAddress'})