首页 > 解决方案 > 尝试对其执行测试时,内置 Number 对象的覆盖方法失败

问题描述

我为Number.isInteger函数编写了 polyfill 方法,如下所示:

export const isInteger = Number.isInteger
  || ((value) => typeof value === 'number' && isFinite(value) && Math.floor(value) === value);

这里一切正常,但我想用 jest 测试它,但我无法覆盖Number.isInteger这个 jest 测试用例中的默​​认方法。测试看起来像这样:

it('should check if isInteger polyfill works correctly', function () {
    Number.isInteger = undefined;
    Number.prototype.isInteger = undefined;
    expect(isInteger(5)).toBe(true);
});

测试通过,但它没有在isInteger常量内执行语句的第二部分。问题是我如何在测试中覆盖这个方法来强制它执行 polyfill?

标签: javascriptjestjs

解决方案


Number.isInteger在导入模块时使用。每次测试都应该重新导入它才能使用 mocked Number.isInteger

Number.isInteger应该恢复到不影响此测试之外的任何内容。

isInteger是静态方法,Number.prototype.isInteger不存在也不需要mock。

它应该是:

const isIntegerOriginal = Number.isInteger;

afterEach(() => {
  Number.isInteger = isIntegerOriginal;
});

it('should check if isInteger polyfill works correctly', function () {
    Number.isInteger = undefined;
    let isInteger;
    jest.isolateModules(() => {
      isInteger = require('...').isInteger;
    });
    expect(isInteger(5)).toBe(true);
});

推荐阅读