【问题标题】:Why if i created a mock i am still getting error?为什么如果我创建了一个模拟我仍然会出错?
【发布时间】:2022-02-11 16:20:32
【问题描述】:

我正在做测试,我在那个测试中做了一个测试,我为一个假函数创建了一个模拟

jest.mock('@/services/myService', ()=>({getAvailables: jest.fn().mockReturnValue()}))

该功能正在我的组件中运行

 onMounted(async () => {
        const answer = await getAvailables1()
        const answer = await getAvailables2()
        const answer = await getAvailables3()

但我仍然收到此错误

(node:81921) UnhandledPromiseRejectionWarning: TypeError: (0 , _ContractService.getAvailables1) 不是函数 (节点:81921)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志

如果我先这样放 getAvailables2

 onMounted(async () => {
            const answer = await getAvailables2()
            const answer = await getAvailables1()

我收到此错误 (node:81921) UnhandledPromiseRejectionWarning: TypeError: (0 , _ContractService.getAvailables2) 不是函数

如果我这样放第一个 getAvailables3

 onMounted(async () => {
            const answer = await getAvailables3()
            const answer = await getAvailables2()

我收到此错误 (node:81921) UnhandledPromiseRejectionWarning: TypeError: (0 , _ContractService.getAvailables3) 不是函数

我也尝试使用mockResolvedValue,但不起作用

export const getAvailables = async () => {
  let response
  let error
  try {
    response = await getData()
  } catch (err) {
    error = err
    throw err
  }
  return { response, error }
}

【问题讨论】:

  • 为了能够提供帮助,我必须查看您要模拟的内容以及您的模拟当前的样子。完整的错误消息也会有所帮助。您的模拟当前调用getData()getData 是什么?它是在回报一个承诺吗?
  • @Tao 但我正在尝试模拟该功能
  • @tao 我更新了我的问题,请再次查看

标签: vue.js jestjs


【解决方案1】:

看起来你想要一个mock partial

jest.mock('@/services/myService', () => {
  const originalModule = jest.requireActual('@/services/myService');

  return {
    __esModule: true,
    ...originalModule,
    getAvailables1: () => Promise.resolve({ foo: 'bar' }),
    getAvailables2: () => Promise.resolve({ foo: 'baz' }),
    getAvailables3: () => Promise.resolve({ foo: 'bad' }),
    /* any other method of your service that gets called */
  };
});

这将模拟模拟中提供的功能,而服务的其余部分将像原来一样运行。

【讨论】:

  • 不行,有没有其他解决办法?
  • 不。我需要更多的上下文。我必须能够看到您正在测试、运行和调试它的内容。你基本上没有表现出足够的东西让任何人找出原因。 “不起作用”对于任何试图帮助你的人来说没有真正的意义。
  • 我更新了我的问题,请再次查看
  • 首先,这不是错误。这是一个警告。其次,警告很明确:它在运行_ContractService.getAvailables1 时发生。在你的模拟中,你只模拟了getAvailables。您还向模拟添加了 getAVailables1 方法。
【解决方案2】:

getAvailables() 是始终返回承诺的异步函数。

因此,为了模拟该函数,您需要返回模拟 promise 的成功或拒绝值。

以下是模拟返回成功承诺的函数的示例。

jest.mock('@/services/myService', () => ({
   getAvailables: jest.fn().mockResolvedValue(true)
}))

【讨论】:

  • 我仍然收到错误
  • 是不是同样的错误?
  • 是的,我仍然遇到同样的错误,我有 4 个函数的 4 个错误,现在在您的帮助下,我得到了 3 个错误
  • 如果您为测试添加 sn-p 以及如何在 js 代码中处理 getAvailables 承诺会有所帮助吗?
  • 我更新了我的问题
猜你喜欢
  • 2010-12-19
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 2023-02-05
相关资源
最近更新 更多