【问题标题】:When mocking a class in typescript using jest/ts-jest I am getting "TypeError: "X".default is not a constructor."当使用 jest/ts-jest 在 typescript 中模拟一个类时,我得到“TypeError:“X”。默认不是构造函数。”
【发布时间】:2019-11-02 18:54:52
【问题描述】:

我正在使用打字稿中的 jest/ts-jest 编写单元测试,我正在尝试模拟一个类,但我得到了一个 TypeError。 “storage_1.default 不是构造函数”。

这就是我嘲笑班级的方式。

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

【问题讨论】:

    标签: typescript mocking jestjs ts-jest


    【解决方案1】:

    因为您在代码中使用 ES2015 imports,所以它希望您的模块的 default 导出可用,但在模拟中您没有提供。修复很简单:

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

    【讨论】:

      【解决方案2】:

      作为对 Dmitriy 的回应,请记住,如果您以 export class AdaptiveCardsStorage 这样的方式导出您的类,您将在您的模拟中反映该命名空间。

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

      【讨论】:

        猜你喜欢
        • 2019-08-19
        • 2021-04-05
        • 2021-06-01
        • 2020-08-06
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        • 2020-01-08
        • 2020-07-27
        相关资源
        最近更新 更多