用笑话模拟对象并通过方法参数传递

Mock object with jest and pass via it via method parameter

我正在尝试使用 jest 模拟整个对象(来自 ag-grid 的 ColumnApi),然后通过参数将其传递给某个函数,该函数从 ColumnApi 调用方法“getAllColumns”。我不关心“getAllColumns”是如何工作的,但我希望它 return 一些特定的列数组 (Column[])。我怎样才能创建这个对象/模拟能够同时:

测试:

describe("test", () => {
   
    // my fruitless tries to create the mock / object:


    // let columnApi: ColumnApi {};

    // const spyInstance = jest.spyOn(columnApi, "getAllColumns");
    // const mock = jest.fn().mockImplementation(()=> "abc");

    // jest.mock("@ag-grid-community/core/dist/cjs/columnController/columnApi", () => columnApi);

    // const columnApiSpy = jest.spyOn(ColumnApi, "getAllColumns");
    //
    // jest.mock("./main", () => ({
    //     columnApi: ,
    // }));
    // let columnApiMock: jest.Mock<ColumnApi>;

    const params = {
        columnApi: columnApi,
    }

    beforeEach(async () => {
        await repository.getRows(params);
    });
});

存储库中的“getRows”函数:

getRows(columnApi: ColumnsApi) {
    
    columnApi.getAllColumns());

}

我认为你只需要模拟间谍的实现。最好在 beforeEach 中执行此操作(这样 jest 就有了更改以删除测试之间的间谍)。

import columnApi from '@ag-grid-community/core/dist/cjs/columnController/columnApi'

describe('test', () => {
  beforeEach(() => {
    jest.spyOn(columnApi, 'getAllColumns').mockImplementation(() => "abc")
    await repository.getRows({ columnApi });
  })
})

无论 columnApi 是什么,或者它是如何导入的,都应该替换实现。

我的问题的答案是创建一个定义了方法“getAllFunctions”的对象。这可以通过以下方式完成:

let columns: Column[] = {};
let columnApi: {
getAllColumns: columns,
}

然后我能够将对象 columnApi 传递给 params 对象并将其传递给 repository.getRows 方法。不需要模拟/间谍,只需根据需要创建我自己的对象类型即可。