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

我需要测试一个函数(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');
  }
});

希望能把事情搞清楚.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...