TypeScript中导入对象的模拟函数

TypeScript中导入对象的模拟函数,typescript,unit-testing,mocking,jestjs,typegoose,Typescript,Unit Testing,Mocking,Jestjs,Typegoose,我有一个TypeScript文件,它导出两个对象(由创建) 我将脚本导入到测试脚本中 // script-under-test.ts import { MyDocumentModel } from './my-document'; export async function createDocument(doc: any) { return await MyDocumentModel.create(doc); } 现在我尝试模拟调用MyDocumentModel.create(doc)

我有一个TypeScript文件,它导出两个对象(由创建)

我将脚本导入到测试脚本中

// script-under-test.ts
import { MyDocumentModel } from './my-document';

export async function createDocument(doc: any) {
  return await MyDocumentModel.create(doc);
}
现在我尝试模拟调用
MyDocumentModel.create(doc)

但是我得到了以下错误-
呼叫数:0


如何模拟导入对象的函数?

您应该实现的工厂函数

例如

my document.ts

//模拟Typegoose类
类类型鹅{
公共getModelForClass(cls){
返回cls.toString();
}
}
导出类MyDocument扩展了Typegoose{}
export const MyDocumentModel=new MyDocument().getModelForClass(MyDocument);
测试中的脚本。ts:

从“/mydocument”导入{MyDocumentModel};
导出异步函数createDocument(文档:任意){
返回等待MyDocumentModel.create(单据);
}
测试中的脚本.test.ts

从“/mydocument”导入{MyDocumentModel};
从“./测试中的脚本”导入{createDocument};
jest.mock('./我的文档',()=>{
常量mMyDocumentModel={create:jest.fn()};
返回{MyDocumentModel:mMyDocumentModel};
});
描述('创建',()=>{
它('应该创建一个新文档',异步()=>{
常量有效载荷={foo:'bar'};
MyDocumentModel.create.mockResolvedValueOnce(文档);
const result=等待创建文档(有效负载);
expect(MyDocumentModel.create).toHaveBeenCalledWith(payload);
期望(结果)到trictequal(文件);
});
});
100%覆盖率的单元测试结果:

PASS stackoverflow/61388982/script-under-test.test.ts(10.103s)
创造
✓ 应创建新文档(5ms)
----------------------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
----------------------|---------|----------|---------|---------|-------------------
所有文件| 100 | 100 | 100 | 100 |
script-under-test.ts | 100 | 100 | 100 | 100 |
----------------------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:11.535s

您似乎可以编写
MyDocumentModel.create=createMock
// script-under-test.ts
import { MyDocumentModel } from './my-document';

export async function createDocument(doc: any) {
  return await MyDocumentModel.create(doc);
}
// script-under-test.test.ts
import { MyDocumentModel } from './my-document';
import { createDocument } from './script-under-test.ts';

jest.mock('./my-document');

describe('creation', () => {
  const MyDocumentModelMock = MyDocumentModel as unknown as jest.Mock;

  it('should create a new document', async () => {
    const payload = { foo: 'bar' };
    const document = {} as Document;
    const createMock = jest.fn();
    createMock.mockReturnValueOnce(document);
    MyDocumentModel.mockImplementation(() => ({ create: createMock }));

    const result = await createDocument(payload);

    expect(createMock).toHaveBeenCalledWith(payload);
    expect(result).toStrictEqual(document);
  });
});