Jest TypeScript 检查类型。

13

假设我有以下接口:

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

接下来我有一个方法,返回该对象类型的数组:

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 [];
    }

}

接下来我想测试一下是否符合这种情况,于是我编写了以下的测试代码

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用作类的实例。它只是一个类型,不会包含在捆绑代码中。 - tmhao2005
instanceof是JavaScript的二元运算符,它接受两个操作数,两者都是“值”。它听起来像Java的instanceof,但实际上并不相似。将其解读为“value instanceof anotherValue”。 - Aluan Haddad
1
你不需要测试它,这就是 TypeScript 的作用。如果返回类型有所不同,TypeScript 在编码时会提醒你。 - philipp
1个回答

17
如果你要查找的类型是一个函数调用,那么 .toBeInstanceOf(Class) 方法接受一个参数,该参数必须是 JavaScript 类构造函数而非 TS 类型。
你应该让 TSC 在编译时检查你是否接收到了正确的数据类型。测试套件和测试用例中编写的代码在运行时执行,.toBeInstanceOf(Class) 是运行时检查,而不是编译时检查。
在运行时,你可能需要使用 expect.objectContaining(object) 来匹配任何递归匹配期望属性的接收到的对象。

在这种情况下,测试 TypeScript 类型是否跨越 fetch 边界有效是有价值的。编译时 TS 检查并不检查你的 CMS 是否会持续向你发送正确的数据。 - Hasen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接