Vue 检查动作是不是使用 spyOn 调用其他动作

Posted

技术标签:

【中文标题】Vue 检查动作是不是使用 spyOn 调用其他动作【英文标题】:Vue checking if action calls other action with spyOnVue 检查动作是否使用 spyOn 调用其他动作 【发布时间】:2019-05-09 04:30:26 【问题描述】:

在 Vue 中,我想使用 Jest 的 spyOn 检查商店中的某个操作是否正确调用另一个操作,我尝试了不同的方法,但它似乎不起作用,这是我的代码:

// index.js

getRecipes ( dispatch ) 
  const fruits = ['apple', 'banana', 'pear']
  fruits.forEach((fruit) => 
    dispatch('getRecipe', fruit)
  )
,
async getRecipe ( commit ) 
  const recipe = await recipesService.fetchRecipe(payload)

  commit(SET_RECIPE,  recipe )
,

// index.spec.js

test('getRecipes calls getRecipe 3 times, each with the right fruit', () => 
  const commit = jest.fn()
  const dispatch = jest.fn()
  const spy = spyOn(actions, 'getRecipe')
  const result = actions.getRecipes( commit, dispatch )

  expect(spy).toHaveBeenCalledTimes(3)
  expect(spy).toHaveBeenCalledWith('apple')
)

但是当我运行测试时,这是我得到的输出:

Expected spy to have been called three times, but it was called zero times.

我想在其他地方测试此类集成(一个操作调用另一个集成),但它仍然给我这个错误。

【问题讨论】:

【参考方案1】:

只测试你的代码,而不是 vuex 的

这种测试的问题在于,您正在测试 vuex 是否按预期工作,这可能毫无价值。

我不会直接监视actions,并断言当dispatch('getRecipe', fruit) 被调用时vuex 正确调用getRecipe 操作,我会测试getRecipes 操作是否正确调用dispatch

test('getRecipes dispatches 3 "getRecipe" actions, each with the right fruit', () => 
  const commit = jest.fn()
  const dispatch = jest.fn()
  const result = actions.getRecipes( commit, dispatch )

  expect(dispatch).toHaveBeenCalledTimes(3)
  expect(dispatch.mock.calls[0][0]).toBe('apple')
  expect(dispatch.mock.calls[1][0]).toBe('banana')
  expect(dispatch.mock.calls[2][0]).toBe('pear')
)

如果你还想测试 vuex 集成怎么办

你并没有真正展示你是如何导入和导出模块的,但我猜在你的代码中,动作文件只是导出一个带有动作的普通对象,而测试只是导入它。

在您的应用程序代码中,您可能会将这些操作添加到 vuex,然后将 vuex 加载到您的应用程序中:

new Vue(store)

因此,在您的测试中,actions 模块确实对 vuex 本身一无所知(我猜是真的,无法从您发布的代码中真正看出,但很有可能)。

这就是为什么你的测试没有按预期工作的原因,因为在测试中 getRecipes 方法只是获取一个 dispatch 参数并调用它,但是 vuex 并没有真正在那里做任何事情,所以没有办法 @987654332 @call 会调用另一个动作。

现在,如果你还想用 jest 测试这个,你应该从一个组件中做,所以你在 vue 和 vuex 的上下文中测试动作。

关于这个in the vue test utils documentation有一个很好的教程。

【讨论】:

【参考方案2】:

当您尝试测试async 功能时,您需要使用await

const getAsyncWithSpyOn = spyOn(actions, 'getRecipe');
expect(await getAsyncWithSpyOn()).toHaveBeenCalledTimes(3)

【讨论】:

以上是关于Vue 检查动作是不是使用 spyOn 调用其他动作的主要内容,如果未能解决你的问题,请参考以下文章

vue jest spyOn 在计算观察者方法调用时不起作用

如何使用 jest.spyOn 测试 RTKQuery 端点

Jasmine spyOn 函数和返回对象

使用变量调用 jest.spyOn “方法名称”参数

Vue & Jest。子组件发出事件时调用测试方法

javascript VUE Jest spyOn