【问题标题】:redis mock for testing in nestjsredis mock 用于在 nestjs 中进行测试
【发布时间】:2020-10-19 09:53:50
【问题描述】:

我正在我的 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,在提供中添加了 RedisService,并且没有 get-redis 方法。 我能够模拟存储库和服务,但我不确定,因为我被 redis 困住了。

知道如何模拟 redis,在文档中找不到任何内容。同样在下一步中,导入服务会起作用还是我必须做其他事情? ConfigService、HttpService、manageSavedSearchService:ManageSavedSearchService

【问题讨论】:

    标签: unit-testing redis nestjs redisclient


    【解决方案1】:

    如果您想在测试中模拟 RedisClient,您需要 provide 与您从 @InjectRedisClient('0') 返回的 DI 令牌相同。这将允许您替换 redis 客户端以进行测试。

    我不熟悉您正在使用的特定 Redis 库,但假设是这个您可以take a look at how the token is constructed

    【讨论】:

    【解决方案2】:
    beforeEach(async () => {
        const module: TestingModule = await Test.createTestingModule({
          providers: [EmailSubscriptionService,{
            provide: EmailSubscriptionService,
            useValue: {
              getClient: jest.fn(),
            }
          }],
        }).compile();
    
        service = module.get<EmailSubscriptionService>(EmailSubscriptionService);
      });
    

    这似乎以某种方式工作,服务类构造函数使用许多其他类,但在提供工作中使用它。它有点违反直觉,因为构造函数中的类需要单独模拟,但不这样做它可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 2022-11-24
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2021-05-21
      相关资源
      最近更新 更多