用笑话模拟对象并通过方法参数传递
Mock object with jest and pass via it via method parameter
我正在尝试使用 jest 模拟整个对象(来自 ag-grid 的 ColumnApi),然后通过参数将其传递给某个函数,该函数从 ColumnApi 调用方法“getAllColumns”。我不关心“getAllColumns”是如何工作的,但我希望它 return 一些特定的列数组 (Column[])。我怎样才能创建这个对象/模拟能够同时:
- 通过参数将其传递给某些需要 ColumnApi 类型的函数
- mock return 这个对象的一个函数的值。
测试:
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
方法。不需要模拟/间谍,只需根据需要创建我自己的对象类型即可。
我正在尝试使用 jest 模拟整个对象(来自 ag-grid 的 ColumnApi),然后通过参数将其传递给某个函数,该函数从 ColumnApi 调用方法“getAllColumns”。我不关心“getAllColumns”是如何工作的,但我希望它 return 一些特定的列数组 (Column[])。我怎样才能创建这个对象/模拟能够同时:
- 通过参数将其传递给某些需要 ColumnApi 类型的函数
- mock return 这个对象的一个函数的值。
测试:
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
方法。不需要模拟/间谍,只需根据需要创建我自己的对象类型即可。