redis - 如何用 jest 模拟 Nestjs-redis

标签 redis jestjs nestjs

我试图在 Nestjs 设置中模拟和监视 redis set 方法,但我认为它没有正常工作。

    const mockRedis = {
      set: jest.fn().mockResolvedValue(undefined),
    };

    const mockRedisService = {
      getClient: jest.fn(() => mockRedis),
    };

    beforeEach(async () => {
      const moduleRef = await Test.createTestingModule({
        providers: [
          { provide: RedisService, useValue: mockRedisService },
        ],
      }).compile();
    });

    it('...',() => {
      const redisSetSpy = jest.spyOn(mockRedis, 'set');

      myTestedMethod();

      expect(redisSetSpy).toBeCalledWith(/* args here */);
    })

我怀疑在这种情况下不可能将spyOn与嵌套方法一起使用作为set?我应该如何模拟 Redis 才能在 set 上使用 spy On?本例中用于 redis 的库是 nestjs-redis

最佳答案

您不必使用 spyOn 来检查已传递给函数的争论。您可以简单地创建一个 jest.fn():

let mockRedisSet;

// Function that creates the testing app.
const createApp = () => {
  const mockRedis = {
    set: mockRedisSet,
  };

  const mockRedisService = {
    getClient: jest.fn(() => mockRedis),
  };

  const moduleRef = await Test.createTestingModule({
    providers: [{ provide: RedisService, useValue: mockRedisService }],
  }).compile();
};

// For each test, set default mock and create testing app.
beforeEach(async () => {
  mockRedisSet = jest.fn().mockResolvedValue(undefined);
  createApp();
});

describe("...", () => {
  // For each sub tests, set default mock and create testing app.
  beforeEach(async () => {
    mockRedisSet = jest.fn().mockResolvedValue(/* Specific value for sub tests */);
    createApp();
  });

  it("...", () => {
    myTestedMethod();

    // Check which arguments was passed to the mock function.
    expect(mockRedisSet).toHaveBeenCalledWith(/* args here */);
  });
});

通过这种方式创建模拟要简单得多,因为您只需创建模拟对象并测试所使用的函数。

这里你的 spy 是mockRedisSet,我重新组织了你的测试文件,因此 spy 函数有一个默认值,可以针对特定测试覆盖该默认值。您可以更好地控制测试值,并为每个测试重置默认值,以便测试不会相互干扰。

关于redis - 如何用 jest 模拟 Nestjs-redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63639171/

相关文章:

redis - ServiceStack.Redis:无法连接:sPort:50071

reactjs - Jest React Native 如何测试 index.PLATFORM.js

typescript - NestJs Swagger 混合类型

javascript - 在 Node.js 中使用 Jest 进行单元测试

node.js - Jest 测试多个测试文件端口 3000 已被使用

node.js - 如何处理级联可观察值

NestJS - 在拦截器中使用服务(不是全局拦截器)

docker - 使用身份验证从 Dockerfile 运行 redis docker 容器

node.js - 使用node序列化redis数据

spring - Ignite 与 Redis Websession 集群