javascript - JestJS:如何获得模拟函数的不同 promise 结果并测试抛出的错误?

标签 javascript unit-testing jestjs

我需要测试一个函数 (example()),它使用另一个函数 (validateDataset)。因为我只想测试 example() 函数,所以我模拟了 validateDataset()

当然,每个测试都需要模拟函数的不同结果。但是如何为模拟函数设置不同的 promise 结果呢?在我下面所示的尝试中,模拟函数总是返回相同的值。

所以在这个例子中我无法测试抛出的错误。

functions.js

import { validateDataset } from './helper/validation'

export async function example (id) {
  const { docElement } = await validateDataset(id)
  if (!docElement) throw Error('Missing content')
  return docElement
}

functions.test.js

import { example } from './functions'

jest.mock('./helper/validation', () => ({
  validateDataset: jest.fn(() => Promise.resolve({
    docMain: {},
    docElement: {
      data: 'result'
    }
  }))
}))

describe('example()', () => {
  test('should return object', async () => {
    const result = await example('123')
    expect(result.data).toBe('result')
  })
  test('should throw error', async () => {
    const result = await example('123')
    // How to get different result (`null`) in this test
    // How to test for the thrown error?
  })
})

最佳答案

Jest 模拟的优点在于,您可以模拟整个模块,并且通过要求其默认导出或命名导出,您仍然可以获得一个模拟,您可以随心所欲地实现和重新实现它。

我已经发布了一个预期 validateDataset 调用失败的测试示例实现。为了简洁起见,我还留下了一些评论。

import { example } from './example';
import { validateDataset } from './helper/validation';

// Declare export of './helper/validation' as a Mock Function.
// It marks all named exports inside as Mock Functions too.
jest.mock('./helper/validation');

test('example() should return object', async () => {
  // Because `validateDataset` is already mocked, we can provide
  // an implementation. For this test we'd like it to be original one.
  validateDataset.mockImplementation(() => {
    // `jest.requireActual` calls unmocked module
    return jest.requireActual('./helper/validation').validateDataset();
  });
  const result = await example('123');
  expect(result.data).toBe('result');
});

test('example() should throw error', async () => {
  // Worth to make sure our async assertions are actually made
  expect.assertions(1);
  // We can adjust the implementation of `validateDataset` however we like,
  // because it's a Mock Function. So we return a null `docElement`
  validateDataset.mockImplementation(() => ({ docElement: null }));
  try {
    await example('123');
  } catch (error) {
    expect(error.message).toEqual('Missing content');
  }
});

希望一切都解决了。

关于javascript - JestJS:如何获得模拟函数的不同 promise 结果并测试抛出的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48034599/

相关文章:

java - 如何将 string[] 发送到 spring Controller ?

c++ - gmock 模拟类不继承任何类

reactjs - 函数内部的 Jest 模拟函数

javascript - 在迭代两个嵌套循环时提高性能

javascript - javascript静态类继承非静态类的表现

unit-testing - 使用协程进行测试时检测到使用不同的调度程序

unit-testing - Testify 似乎同时运行测试套件?

react-native - 为 Jest 模拟 Reactotron

javascript - 测试一个函数是否在另一个函数 Jest 中被调用

javascript - SVG 动画在 Firefox 上不起作用