用 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` 参数? [复制]

用 Jest 模拟 Firebase 功能(单元测试)

通过作为方法参数传递对象的副本

用 Jest 模拟基于承诺的请求

使用变量调用 jest.spyOn “方法名称”参数

用 Jest 模拟 jsonwebtoken 模块