constmockFn=jest.fn()mockFn()expect(mockFn).toHaveBeenCalled()// With a mock implementation:constreturnsTrue=jest.fn(() =>true)console.log(returnsTrue()) // true;
Spy 并不会影响到原有模块的功能代码,而只是充当一个监护人的作用。比如说上文中的 video 模块中的 play() 方法已经被 spy 过,那么之后 play() 方法只要被调用过,我们就能判断其是否执行,甚至执行的次数。
2.3 异步测试
第一种:Vue 会异步的将未生效的 DOM 批量更新,避免因数据反复变化而导致不必要的渲染。因此在更新会引发 DOM 变化的属性后必须使用 Vue.nextTick() (异步函数)来等待 Vue 完成 DOM 更新。
it('button click should increment the count text',async () => {expect(wrapper.text()).toContain('0')constbutton=wrapper.find('button')button.trigger('click')awaitVue.nextTick()expect(wrapper.text()).toContain('1')})
// 将 done(通知测试完成的回调函数) 与 $nextTick 或 setTimeout 结合使用it('fetches async when a button is clicked', done => {constwrapper=shallowMount(Foo)wrapper.find('button').trigger('click')wrapper.vm.$nextTick(() => {expect(wrapper.vm.value).toBe('value')done() })})// 或者通过npm i flush-promises (建议使用,可读性较好)import flushPromises from'flush-promises'it('fetches async when a button is clicked',async () => {constwrapper=shallowMount(Foo)wrapper.find('button').trigger('click')awaitflushPromises()expect(wrapper.vm.value).toBe('value')})