【问题标题】:will it be hoisted when a variable is transformed in jest test case?当变量在 jest 测试用例中转换时,它会被提升吗?
【发布时间】:2020-08-19 06:35:31
【问题描述】:

我正在开发和测试 Array.isArray 模块。

isArray 模块

export isArray function (arg) {
  if (Array.isArray) {
    return Array.isArray(arg);
  }
  return Object.prototype.toString.call(arg) === '[object Array]';
}

isArray TC

describe('isArray test', () => {
  describe('[native] test', () => {
    test('[] => true', () => {expect(isArray([])).toBe(true); });
  });

  describe('[native not exist] test', () => {
    delete Array.isArray;
    test('[] => true', () => {expect(isArray([])).toBe(true); });
  });
});
     

delete Array.isArray 阶段似乎正在提升。 因此,所有 TC 都不是 isArray 模块的原生代码。 描述阶段在 TC 中提升? 请告诉 mw 如何使其不受影响的删除阶段。

【问题讨论】:

  • 提升只与声明有关,其他任何事情都没有这种机制。不过,我不清楚这里的问题是什么 - 你如何确定 delete 总是先运行?
  • 另请注意,与 test/it/afterX/beforeX 回调相反,describe 回调的内容在测试定义时间而不是在测试执行时间运行。
  • 测试定义在执行时执行。并且 delete Array.isArray 阶段在定义时执行。我认为这个问题是定义和执行时间。

标签: javascript jestjs testcase


【解决方案1】:

“提升”在这里不是正确的术语 - 您只是删除了一个全局属性而没有将其重置为原始值,并且这将在测试用例之间持续存在。

最简单的修复方法是手动重置对象:

describe("[native not exist] test", () => {
  test("[] => true", () => {
    const originalIsArray = Array.isArray;  // Grab original function
    delete Array.isArray;  // Remove it
    expect(isArray([])).toBe(true);  // Test
    Array.isArray = originalIsArray;  // Undo the removal
  });
});

【讨论】:

  • 只是提到 - 对于测试,这可能没问题。如果需要删除和重新添加更正确(尽管上帝知道为什么会这样),您可以执行original = Object.getOwnPropertyDescriptor(target, property); delete target[property]; /* later */ Object.defineProperty(target, property, original);。这将保留属性的属性描述符。
  • 我在第三个 describe 语句中删除了 Array.isArray,但是当我运行测试用例时,第一个语句中的 Array.isArray 也被删除了。如果我从 describe 语句中删除它,它会异步执行,然后执行 test 语句。
  • 如果我采纳您的意见,我是否必须删除并恢复每个测试用例?
  • 例如,您可以使用beforeEach()afterEach()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2018-06-01
  • 2021-07-17
  • 1970-01-01
  • 2014-12-31
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多