unit-testing - redis mock 用于在 nestjs 中进行测试
问题描述
我正在我的 email-service.spec.ts 文件中编写测试用例
我的电子邮件服务文件
@Injectable()
export class EmailSubscriptionService {
private nodeTokenCache;
private result;
constructor(@InjectRepository(ConsumerEmailSubscriptions) private readonly emailSubscriptions: Repository<ConsumerEmailSubscriptions>,
@InjectRepository(EmailSubscriptions) private readonly emailSubscriptionLegacy: Repository<EmailSubscriptions>,
@InjectRedisClient('0') private redisClient: Redis.Redis,
private readonly config: ConfigService, private http: HttpService,
private readonly manageSavedSearchService: ManageSavedSearchService) {
}
我的 email-service.spec.ts 文件
import { RedisService } from 'nestjs-redis';
import { ConfigService } from '@nestjs/config';
import { HttpService } from '@nestjs/common';
import { ManageSavedSearchService } from './../manage-saved-search/manage-saved-search.service';
describe('EmailSubscriptionService', () => {
let service: EmailSubscriptionService;
let entity : ConsumerEmailSubscriptions;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports:[RedisModule],
// https://github.com/nestjs/nest/issues/1229
providers: [EmailSubscriptionService,
{
// how you provide the injection token in a test instance
provide: getRepositoryToken(ConsumerEmailSubscriptions),
// as a class value, Repository needs no generics
useClass: Repository,
// useValue: {
// }
},
{
provide: getRepositoryToken(EmailSubscriptions),
useClass: Repository,
},
RedisService,
// {
// provide : RedisService,
// useClass: Redis
// },
ConfigService, HttpService, ManageSavedSearchService
],
}).compile();
service = module.get<EmailSubscriptionService>(EmailSubscriptionService);
// entity = module.get<Repository<ConsumerEmailSubscriptions>>(getRepositoryToken(ConsumerEmailSubscriptions));
});
it('should be defined', async () => {
expect(service).toBeDefined;
});
});
结果----> Nest 无法解析 EmailSubscriptionService 的依赖项(ConsumerEmailSubscriptionsRepository、EmailSubscriptionsRepository、?、ConfigService、HttpService、ManageSavedSearchService)。请确保索引 [2] 处的参数 REDIS_CLIENT_PROVIDER_0 在 RootTestModule 上下文中可用。
我无法根据服务文件中的依赖关系在 email-service.spec.ts 中模拟我的 redisclient。我试过useClass,在provide中添加了RedisService,没有get-redis方法。我能够模拟存储库和服务,我不确定,因为我被 redis 困住了。
任何想法如何模拟 redis,在文档中都找不到任何东西。同样在下一步中,导入服务会起作用还是我必须做其他事情?ConfigService、HttpService、manageSavedSearchService:ManageSavedSearchService
解决方案
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [EmailSubscriptionService,{
provide: EmailSubscriptionService,
useValue: {
getClient: jest.fn(),
}
}],
}).compile();
service = module.get<EmailSubscriptionService>(EmailSubscriptionService);
});
这似乎以某种方式工作,服务类构造函数使用许多其他类,但在提供工作中使用它..它有点违反直觉,因为构造函数中的类需要单独模拟,但不这样做它就可以工作。
推荐阅读
- java - CraftBukkit 开发:为什么会抛出 NullPointerException?
- python - 将一个数据框中的每一行与 Python 中另一个数据框中的每一行进行比较
- npm - 为什么我无法运行“安装 NPM”命令
- tensorflow - 增强周期性数据的机器学习模型
- sql - 您可以根据多个标准在 SQL 中创建百分位排名吗?
- html - 媒体查询在实际 iPhone 设备/模拟器上不起作用
- python - 试图将数据插入 mysql 数据库,但我收到错误,因为模块 'mysql.connector' 没有属性 'connector'
- google-cloud-endpoints - 组件网关通过 terraform 启用 dataproc 集群的问题
- python - 谷歌云机器人通信
- python - 可以同时调用递归(解析)函数吗?