【问题标题】:How to write a test of TypeScript compile error如何编写 TypeScript 编译错误的测试
【发布时间】:2021-04-06 06:16:11
【问题描述】:

我正在寻找一种可能性,如何编写一个单元测试来测试一个函数,如果它抛出一个 TypeScript 错误。

我有这个代码:

class MyClass {
  method() { }
  property: number = 10;
}

function someFunction<T, M extends keyof T & {
  [Property in keyof T[M]]: Function;
}>(object: T, method: M) {

}

const myClass = new MyClass();

// next row will throw an error because myClass.property isn't a function
someFunction(myClass, "property");

我需要测试这段代码是否会引发 TypeScript 错误。如果是这样,那么一切都很好。

为什么?此代码只是一个示例。我有一个库,我的意图是定义一个函数应该做什么。我想为函数 someFunction 提供这些规则。这意味着方法的名称将始终是函数的名称,而不是数字或字符串等。

我想写一个测试来检查我以后没有破坏这个逻辑。我想我可以把这个简单的例子放到一个单独的忽略文件中,并编写我自己的测试库,它将加载文件并直接运行 tsc 编译器。但在我想做这样的事情之前,我想问一下是否有任何工具可以代替。

【问题讨论】:

  • 不知道为什么要重新发明轮子。这就是工具的用途。使用 tsconfig.json 来建立您的严格级别,它将失败构建或使用 ts-loader 或带有扩展的 babel 通过。 IDE 编辑器也可以显示错误,我认为这是使用 typescript 的主要原因。

标签: typescript


【解决方案1】:

我刚刚在我的 CI 工具中添加了一个 typescript 编译步骤,以防止我不得不手动运行它(请参阅https://github.com/cefn/lauf/blob/main/.github/workflows/tests.yml#L29-L30

在我的 repo 中,我设置了运行 tsc --noEmit 的 github 操作,以显示我在允许我合并之前可能在分支中引入的任何编译错误。它不是作为这样的测试套件编写的,但它在管道的完全相同的部分中运行。

在您的情况下,您想在某个子文件夹上运行它(比如说./failures/,但知道编译失败,也就是说反转退出状态 - 如果它不为零,那很好,因此应该解决零。如果为零,那就不好了,因此应该解析为非零。

如果您在 bash 环境中,您可以在 package.json 中使用额外的脚本目标来实现此目的,然后从您正在使用的任何构建或集成管道中调用此 npm 脚本,例如 npm run verifyfailures

  "scripts": {
    "verifyfailures": "npx --no-install tsc --noEmit ./failures/; if [ $? -eq 0 ] ; then echo 'INCORRECTLY PASSED' && false ; else echo 'CORRECTLY FAILED' && true; fi"
  },

【讨论】:

  • 谢谢,这个主意不错。
猜你喜欢
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 2017-04-02
相关资源
最近更新 更多