【问题标题】:Jest test failing when using Array.prototype.includes with Typescript?将 Array.prototype.includes 与 Typescript 一起使用时,Jest 测试失败?
【发布时间】:2020-07-15 15:53:17
【问题描述】:

我开始在这个项目中使用 Array.prototype.includes:

https://github.com/fireflysemantics/validator

使用Angular包格式打包,源码在这个目录:

https://github.com/fireflysemantics/validator/tree/master/projects/validator

项目构建良好,但是运行 Jest 测试时会出现此错误:

 FAIL  projects/validator/src/lib/decorators/IsDefined.spec.ts
  ● should create an error when using validate

    TypeError: Cannot read property 'includes' of undefined

      35 |   const mc: MetaClass = ValidationContainer.metaClasses.get(cn);
      36 |   if (mc) {
    > 37 |     const properties: string[] = mc.properties.filter(p => !exlude.includes(p))

所以看起来 Jest 没有选择属性 typescript 配置,其中包括:

    "lib": [
      "dom",
      "es2018"
    ]

想法?

【问题讨论】:

  • 记录exlude并检查它是否存在

标签: javascript angular typescript jestjs angular-package-format


【解决方案1】:

您误解了错误。不是includes不被允许。

它无法访问属性includes 的值为undefined,即显然您尝试执行undefined.includes,因此这意味着exlude 必须是undefined。


在您的IsDefined.spec.ts 中,您像这样调用validate:

it(`should create an error when using validate`, ()=>{
  let IDI = new IsDefinedInvalid();
  let e = validate(IDI);
  expect(e.valid).toBeFalsy();
});

因此,您只将 1 个参数 (IDI) 传递给 validate。但是,在validate.ts 中,您可以这样定义函数:

export function validate(target: any, exlude?: string[]): ObjectErrors {
  let oes: ObjectErrors = new ObjectErrors();
  const cn: string = target.constructor.name;
  const mc: MetaClass = ValidationContainer.metaClasses.get(cn);
  if (mc) {
    const properties: string[] = mc.properties.filter(p => !exlude.includes(p))
    properties.forEach(p => {
      if (!validateProperty(target, p, oes)) {
        oes.valid = false;
      }
    });
  }
  return oes;
}

如您所见,validate 采用 两个 参数 - target 和 exlude。 (顺便说一句,那是拼写错误的,应该是exclude 和c。)是的,exlude 用? 标记为可选,所以在合同上你可以省略它,但是在validate函数然后你使用exlude(在崩溃的行中)而不首先检查它是否是undefined,所以你最终调用undefined.includes(p)!

说实话,我不确定为什么 TypeScript 编译器此时没有抱怨。 (也许评论者知道为什么......)

无论如何,解决方法是在validate.ts中的函数定义中设置一个默认值[]:

export function validate(target: any, exlude: string[] = []): ObjectErrors {

(当然,在调用函数(validate(IDI, []))时,将第二个参数作为空数组传递也可以,但是validate中的错误仍然存​​在。)

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 2021-03-28
    • 2020-01-01
    • 2018-08-09
    • 1970-01-01
    • 2020-11-18
    • 2021-10-27
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多