简体   繁体   中英

When mocking a class in typescript using jest/ts-jest I am getting "TypeError: "X".default is not a constructor."

I am writing a unit test using jest/ts-jest in typescript and I am trying to mock a class but I am getting a TypeError. "storage_1.default is not a constructor".

Here is how I am mocking the class.

index.test.ts

import GetAdaptiveCard from '../../GetAdaptiveCard/index'

const mockGetAdaptiveCard = jest.fn();
jest.mock('../../utils/storage', () => {
    return jest.fn().mockImplementation(() => {
        return {
            getAdaptiveCard: mockGetAdaptiveCard
        }   
    })
})
test('http trigger should return adaptive card', async () => {
....
    await GetAdaptiveCard(context, req);//calls AdaptiveCardStorage. The class I am mocking in "../../utils/storage"
...
});

index.ts

import AdaptiveCardsStorage from '../utils/storage';
...
const storage: AdaptiveCardsStorage = new AdaptiveCardsStorage(); //This is where I get the TypeError
const adaptiveCard: string = await storage.getAdaptiveCard(userID, cardName);

utils/storage.ts

export default class AdaptiveCardsStorage {
    /**
     * 
     * Class to interface with adaptive cards storage.
     * 
     */

    private tableService: storage.TableService;
    private tableName: string = Config["TABLE_STORAGE_TABLE_NAME"];

    public constructor() {
        this.tableService = storage.createTableService();
    }

    public async getAdaptiveCard(userID: string, cardName: string): Promise<string> {
        return new Promise((resolve, reject) => {
            this.tableService.retrieveEntity<any>(this.tableName, userID, cardName, (err, result) => {
                if (!err) {
                    resolve(result.Content["_"]);
                } else {
                    reject(err);
                }
            });
        });
    }

}

This is what I got.

    TypeError: storage_1.default is not a constructor


const handleRequest = async function (userID: string, cardName: string, context: Context) {
const storage: AdaptiveCardsStorage = new AdaptiveCardsStorage();
         |                                           ^
const adaptiveCard: string = await storage.getAdaptiveCard(userID, cardName);

at GetAdaptiveCard/index.ts:19:
at dist/GetAdaptiveCard/index.js:7:71
at Object.<anonymous>.__awaiter (dist/GetAdaptiveCard/index.js:3:12)
at handleRequest (dist/GetAdaptiveCard/index.js:29:
at Object.<anonymous> (GetAdaptiveCard/index.ts:9:29)
at dist/GetAdaptiveCard/index.js:7:71

Because you are using ES2015 import s for your code it expects the default export of your module to be available, but in the mock you do not provide one. Fix is very simple:

jest.mock('../../utils/storage', () => {
    return { // need to add this nested `default` property
        default: jest.fn().mockImplementation(() => {
            return {
                getAdaptiveCard: mockGetAdaptiveCard
            }   
        })
    }
})

Just in response to Dmitriy, keep in mind, if you're exporting your class in such a way as export class AdaptiveCardsStorage , you would reflect that namespace in your mock.

jest.mock('../../utils/storage', () => {
    return { // need to add this nested `default` property
        AdaptiveCardsStorage: jest.fn().mockImplementation(() => {
            return {
                getAdaptiveCard: mockGetAdaptiveCard
            }   
        })
    }
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM