【问题标题】:Testing for a TypeError using Typescript and Jasmine使用 Typescript 和 Jasmine 测试 TypeError
【发布时间】:2016-12-06 04:18:34
【问题描述】:

我正在尝试做的是在 Typescript 中为我们使用纯 JS 编写的现有函数库编写单元测试已经有一段时间了。我们所有的页面逻辑也都是纯 JS。当输入错误的类型时,其中一些函数会引发异常。例如:

Collection.pluck([{"a":1},{"a":2}], "a") // Pulls the values out of a list of objects
> [1, 2]

所以第二个参数应该是一个字符串,你想要获取值的属性名称。在 pluck 函数中,有一个类型检查来验证是否传入了一个对象数组,当失败时它会抛出一个 TypeError。

所以要编写一个测试来验证是否传入了正确类型的对象,我会像在普通 JS 中那样编写它:

expect(function(){ Collection.pluck([{"a":1},{"a":2}], 0); }).toThrowError(TypeError);

但是在我的声明文件中,我将其定义为:

declare namespace Collection {
    function pluck(obj: Object, propertyName: string): any;
}

所以当我使用 TS 编写单元测试时,我得到一个编译错误,很明显:

那么如何在不改变功能的情况下做我想做的事呢?我可以在 TS 中配置一些东西来仅针对这个文件忽略它吗?

【问题讨论】:

    标签: typescript jasmine


    【解决方案1】:

    如果您可以更改测试,可以尝试将测试的第二个参数作为字符串发送。

    expect(function(){ Collection.pluck([{"a":1},{"a":2}], '0'); }).toThrowError(TypeError);
    

    更新: 当您在函数声明中指定类型时,您使用的 typescript 已经在编译阶段进行了类型检查(转换为 JS )。从技术上讲,您的代码已经通过了测试用例。 如果您确实需要通过单元测试进行类型验证,您应该针对类型设置为“任何”的情况进行处理,因为在编译期间不会检查这些情况。 或者在这里查看 Unittesting in TypeScript

    【讨论】:

    • 虽然这会阻止 TS 错误,但它会导致测试失败,因为我正在测试它是否明确是一个字符串。我还做其他类似的测试,我正在检查对象、数组、函数等,我也有同样的问题。
    • 我想我可以使用“任何”。这很奇怪,因为它没有反映使用 TS 时函数的内部工作原理,但我们不能在应用程序的任何地方开始使用 TS,所以除了我之外,任何人都不会看到定义中的这个“错误”。重要的是编译后的 JS 保持不变,继续抛出 TypeError。
    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 2017-11-22
    • 2016-05-28
    • 2015-09-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2015-12-07
    相关资源
    最近更新 更多