我试图在 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/