如何模拟弹性搜索服务的批量方法

Posted

技术标签:

【中文标题】如何模拟弹性搜索服务的批量方法【英文标题】:How to Mock a bulk method of elastic search searvice 【发布时间】:2022-01-17 19:42:36 【问题描述】:

我正在为我的 searchService 做测试,我意识到用于向 elasticSearch db 插入数据的批量方法有一些实习操作。

beforeEach(async () => 
const moduleRef: TestingModule = await Test.createTestingModule(
  providers: [
    SearchService,
    
      provide: ElasticsearchService,
      useValue: 
        bulk: jest.fn(),
        count: jest.fn(),
        helpers: 
          scrollSearch: jest.fn(),
        ,
        search: jest.fn(),
      ,
    ,
    
      provide: PrismaService,
      useValue: 
        skus: 
          findMany: jest.fn().mockResolvedValueOnce(findManyMock),
          findUnique: jest.fn().mockResolvedValue(),
          update: jest.fn().mockResolvedValue(),
          create: jest.fn().mockResolvedValue(),
          delete: jest.fn().mockResolvedValue(),
        ,
      ,
    ,
  ],
).compile();

调用的批量方法:

for await (const chunk of arrayOfBulkBodiesInChunks) 
  const bulkBody = chunk.flatMap((doc) => [
     index:  _index: this.index  ,
    doc,
  ]);

  await this.elasticsearchService.bulk(
    refresh: true,
    body: bulkBody,
  );

我正在寻求帮助,为批量操作编写一个模拟。

【问题讨论】:

【参考方案1】:

,您可以模拟您的依赖项或提供程序,试试这个:

在/ElasticsearchService所在的同一个文件目录下,创建一个名为mocks的文件,例如:ElasticsearchService本地化在/service/ElasticsearchService.ts,创建一个文件/service/mocks/ElasticsearchService.ts 模拟 ElasticsearchService.ts 会将服务导出到模拟

    export const ElasticsearchService = jest.fn().mockReturnValue(
     //Name here the function to mock
     bulk: jest.fn().mockReturnValue(
    bulk: jest.fn(),
    count: jest.fn(),
    helpers: 
      scrollSearch: jest.fn(),
    ,
    search: jest.fn(),
  )

然后在您的测试开始时。

jest.mock('/file/ElasticsearchService') //Type here the exact ubication of your ElasticsearchService, jest automatically will implement the file with the same name in the folder __mocks__

```beforeEach(async () => 
const moduleRef: TestingModule = await Test.createTestingModule(
  providers: [
    SearchService,
    
      provide: ElasticsearchService,
      useValue: 
        bulk: jest.fn(),
        count: jest.fn(),
        helpers: 
          scrollSearch: jest.fn(),
        ,
        search: jest.fn(),
      ,
    ,
    
      provide: PrismaService,
      useValue: 
        skus: 
          findMany: jest.fn().mockResolvedValueOnce(findManyMock),
          findUnique: jest.fn().mockResolvedValue(),
          update: jest.fn().mockResolvedValue(),
          create: jest.fn().mockResolvedValue(),
          delete: jest.fn().mockResolvedValue(),
        ,
      ,
    ,
  ],
).compile();```

希望你能解决它

【讨论】:

以上是关于如何模拟弹性搜索服务的批量方法的主要内容,如果未能解决你的问题,请参考以下文章

如何保持弹性搜索在 Linux 服务器上运行

使用弹性搜索设计搜索服务

弹性搜索批量请求长度

如何在 Kotlin 中管理单元测试资源,例如启动/停止数据库连接或嵌入式弹性搜索服务器?

对于没有类型的索引,您如何允许在 elasticsearch6 上使用特定的 http 方法?

运行测试时服务弹性搜索不可见