【发布时间】:2022-02-16 00:29:40
【问题描述】:
我正在开发 NestJs 应用程序,并在 user.service.ts 中为我的 authenticateUser 函数编写了单元测试。它已经传入我的本地机器。但是当我将它部署到服务器并运行单元测试时,出现错误Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED.redis mock 好像不起作用。我应该如何模拟 redis 并解决这个问题才能正常工作?
user.service.ts
async authenticateUser(authDto: AuthDTO): Promise<AuthResponse> {
try {
const userData = await this.userRepository.findOne({msisdn});
if(userData){
await this.redisCacheService.setCache(msisdn, userData);
}
} catch (error) {
console.log(error)
}
}
redisCache.service.ts
export class RedisCacheService {
constructor(
@Inject(CACHE_MANAGER) private readonly cache: Cache,
) {}
async setCache(key, value) {
await this.cache.set(key, value);
}
}
user.service.spec.ts
describe('Test User Service', () => {
let userRepository: Repository<UserEntity>;
let userService: UserService;
let redisCacheService: RedisCacheService;
let cacheManager: any;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UserService,
UserEntity,
RedisCacheService,
{
provide: getRepositoryToken(UserEntity),
useClass: registeredApplicationRepositoryMockFactory,
},
],
imports: [CacheModule.register({})],
}).compile();
userService = module.get<UserService>(UserService);
userRepository = module.get<Repository<UserEntity>>(
getRepositoryToken(UserEntity),
);
redisCacheService = module.get<RedisCacheService>(RedisCacheService);
cacheManager = module.get<any>(CACHE_MANAGER);
});
it('authenticateUser should return success response', async () => {
const userEntity = { id: 1, name: 'abc', age: 25 };
const mockSuccessResponse = new AuthResponse(
HttpStatus.OK,
STRING.SUCCESS,
`${STRING.USER} ${STRING.AUTHENTICATE} ${STRING.SUCCESS}`,
{},
);
jest.spyOn(userRepository, 'findOne').mockResolvedValueOnce(userEntity);
jest.spyOn(redisCacheService, 'setCache').mockResolvedValueOnce(null);
expect(await userService.authenticateUser(mockAuthBody)).toEqual(mockSuccessResponse);
});
});
【问题讨论】:
-
看起来您的
RedisCacheService正在加载随后尝试连接到 Redis 的@Inject(CACHE_MANAGER)。您可以完全模拟RedisCacheService参见 jestjs.io/docs/es6-class-mocks 或 jestjs.io/docs/manual-mocks -
是因为
CACHE_MANAGER吗?我可以在这里模拟整个 redis 吗? -
您可以使用
npm redis-server并在创建TestingModule之前创建一个Redis 实例(在BeforEach中)。这样,将为每个测试创建一个临时 Redis-Server(只需添加AfterEach即可将其删除)。但是...如果您要编写单元测试,您应该模拟RedisCacheService而不是添加网络组件。
标签: node.js unit-testing redis jestjs nestjs