用 jest 模拟对象并通过方法参数传递
Posted
技术标签:
【中文标题】用 jest 模拟对象并通过方法参数传递【英文标题】:Mock object with jest and pass via it via method parameter 【发布时间】:2021-07-11 15:08:11 【问题描述】:我正在尝试使用 jest 模拟整个对象(来自 ag-grid 的 ColumnApi),然后通过参数将其传递给某个函数,该函数从 ColumnApi 调用方法“getAllColumns”。我不在乎“getAllColumns”是如何工作的,但我希望它返回一些特定的列数组(Column[])。我怎样才能创建这个对象/模拟能够同时:
通过参数将其传递给某些需要 ColumnApi 类型的函数 此对象的一个函数的模拟返回值。测试:
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());
【问题讨论】:
【参考方案1】:我认为你只需要模拟间谍的实现。最好在 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
是什么,或者它是如何导入的,都应该替换实现。
【讨论】:
我试过这个(可以在注释掉的代码中看到) - 它不起作用,因为 columnApi 的类型不是 ColumnApi (我假设你想用 let columnApi 创建它: ColumnApi ;) 如果没有 ColumnApi 类型,我无法将其传递给 repository.getRows(...) 方法【参考方案2】:我的问题的答案是创建一个定义了方法“getAllFunctions”的对象。这可以通过以下方式完成:
let columns: Column[] = ;
let columnApi:
getAllColumns: columns,
然后我能够将对象columnApi
传递给params
对象并将其传递给repository.getRows
方法。无需模拟/监视,只需根据需要创建我自己的对象类型即可。
【讨论】:
以上是关于用 jest 模拟对象并通过方法参数传递的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Jest 单元测试中模拟在 `created` Vue 生命周期挂钩中调用的方法,而不使用`shallowMount` 中已弃用的`methods` 参数? [复制]