【问题标题】:Jest's expect(value).toBeInstanceOf(Class) fails for expect(util.promisify(...)()).toBeInstanceOf(Promise) and othersJest 的 expect(value).toBeInstanceOf(Class) 对 expect(util.promisify(...)()).toBeInstanceOf(Promise) 等失败
【发布时间】:2019-09-21 00:24:26
【问题描述】:

设置:

  • 开玩笑: 21.2.1
  • 节点: 10.16.3
  • npm: 6.9.0

为什么 Jest 的 expect 不能将 node.js 的 util.promisify 返回的 Promise 识别为 Promise 的实例?

以下失败:

const util = require('util');

const fn = util.promisify((opts, cb) => cb(null, {})); 
const promise = fn();
expect(promise).toBeInstanceOf(Promise)

同样,以下失败:

const util = require('util');

const fn = util.promisify((opts, cb) => cb(null, {}));
const promise = fn();
expect(promise.then).toBeInstanceOf(Function);

可以通过检查 typeof promise.then 是否为“功能”来规避该问题,但我对这种行为的原因很感兴趣。

非常感谢您提供的信息!

【问题讨论】:

  • 它可能会返回实现 Promise 接口的东西,但它不是 Promise 的实例。
  • 可以理解,但是为什么promise.then instanceof函数会失败呢?它返回的是可调用但不是函数的东西? O.o

标签: node.js jestjs


【解决方案1】:

Jest 中有一个长期存在的错误,名为"Jest globals differ from Node globals"。这严重限制了toBeInstanceOf 方法的有效性,除非您针对您自己的类之一的实例进行测试。目前,最简单的解决方法是简单地测试expect(fn().constructor.name).toBe('Promise'),完全理解它的用处比instanceof 更有限。总比没有好,因为在不久的将来似乎不会修复 Jest 错误。

我也可能建议您的示例测试是不必要的,因为您有点测试util.promisify 的内部结构,但我知道这可能只是一个更大问题的 MVP。祝你好运!

【讨论】:

  • 感谢您的详尽回答!这是可复制性的一个最小示例,但是我同意你的观点:)
猜你喜欢
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2019-03-04
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多