【问题标题】:Jest typescript check for type开玩笑打字稿检查类型
【发布时间】:2021-01-09 19:13:11
【问题描述】:

假设我有以下界面:

export interface CMSData {
    id: number;
    url: string;
    htmlTag: string;
    importJSComponent: string;
    componentData: ComponentAttribute[];
}

然后我有一个method,它返回这个对象类型的array

public async GetContent(url: string): Promise<CMSData[]>{
    const response = await super.get<ICMSContentData[]>(url, {});
    try {
        if (response?.parsedBody) {
            return this.ProcessResponse(response.parsedBody);
        } else {
            this.handleHTTPError(new Error("Error"));
            return [];
        }

    } catch (e) {
        this.handleHTTPError(e);
        return [];
    }

}

然后我想测试是不是这样,所以我写了以下test

import {ContentIOService} from "..";
import {CMSData} from "../IOServices/ContentIOService";

require('es6-promise').polyfill();
require('isomorphic-fetch');

test('Get Content', async () => {
    const service = ContentIOService.getInstance();
    const data = await service.GetContent("https://1c7207fb14fd3b428c70cc406f0c27d9.m.pipedream.net");
    console.log(data)
    expect(data).toBeInstanceOf(CMSData[]);
});

但是在这里我得到以下错误:

'CMSData' 仅指一种类型,但在这里用作值。

那么我如何测试我返回的数据是否有效且类型正确?

【问题讨论】:

  • 这是正确的,因为你不能在这里使用CMSData 作为类的实例。它只是一种不会包含在捆绑代码中的类型。
  • instanceof 是一个 JavaScript 二元运算符,它接受两个操作数,这两个操作数都是 。这听起来像 Java 的instanceof,但它甚至不是类似的。阅读为value instanceof anotherValue
  • 你不需要测试,这就是打字稿的用途。如果返回类型不同,打字稿会在编码时通知您。

标签: javascript typescript unit-testing jestjs


【解决方案1】:

.toBeInstanceOf(Class) 方法接受一个必须是 JavaScript 类构造函数而不是 TS 类型的参数。

您应该让 TSC 在编译时检查您是否收到了正确类型的数据。在测试套件和测试用例中编写的代码在运行时执行,.toBeInstanceOf(Class) 是运行时检查,而不是编译器时间。

在运行时,您可能希望使用expect.objectContaining(object) 匹配任何递归匹配预期属性的接收对象。

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 2021-10-26
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2022-08-07
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多