当使用jest/ts-jest模拟打字稿中的类时,我得到"TypeError:"X".默认不是构造函数." [英] When mocking a class in typescript using jest/ts-jest I am getting "TypeError: "X".default is not a constructor."

查看:127
本文介绍了当使用jest/ts-jest模拟打字稿中的类时,我得到"TypeError:"X".默认不是构造函数."的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用打字稿中的jest/ts-jest编写单元测试,并且尝试模拟一个类,但是却遇到TypeError. "storage_1.default不是构造函数".

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);
                }
            });
        });
    }

}

这就是我得到的.

    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

推荐答案

由于您正在使用ES2015 import作为代码,因此它希望模块的default导出可用,但在模拟中您不会提供一个.修复非常简单:

Because you are using ES2015 imports 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
            }   
        })
    }
})

这篇关于当使用jest/ts-jest模拟打字稿中的类时,我得到"TypeError:"X".默认不是构造函数."的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆