Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jest typescript check for type

lets say i have the following interface:

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

Then i have a method that returns an array of this object type:

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

}

Then i want to test that this is the case so i write the following 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[]);
});

However here i get the following error:

'CMSData' only refers to a type, but is being used as a value here.

So how can i test that the data i get back is valid and of the right type?

like image 515
Marc Rasmussen Avatar asked Jan 27 '26 23:01

Marc Rasmussen


1 Answers

If the type you're looking for is a call, the .toBeInstanceOf(Class) method accepts a parameter which MUST BE a JavaScript class constructor instead of TS type.

You should let TSC check whether you receive the correct type of data at compile time. Code written inside test suites and test cases is executed at runtime, .toBeInstanceOf(Class) is a runtime check, NOT compiler time.

At runtime, you may want to use expect.objectContaining(object) matches any received object that recursively matches the expected properties.

like image 60
slideshowp2 Avatar answered Jan 29 '26 13:01

slideshowp2



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!