skip to Main Content

I am writing test cases in my email-service.spec.ts file

my email-service file

@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) {
  }

my email-service.spec.ts file

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;
  });
});

result —->
Nest can’t resolve dependencies of the EmailSubscriptionService (ConsumerEmailSubscriptionsRepository, EmailSubscriptionsRepository, ?, ConfigService, HttpService, ManageSavedSearchService). Please make sure that the argument REDIS_CLIENT_PROVIDER_0 at index [2] is available in the RootTestModule context.

I am unable to mock my redisclient in email-service.spec.ts as per the dependency in the service file. I have tried useClass, added RedisService in provide and there are no get-redis methods.
I am able to mock the repositories and for services, I don’t know for sure as I am stuck with redis.

Any idea how to mock redis, couldn’t find anything in the docs. Also in the next step, will importing the services work or I have to do anything else?
ConfigService, HttpService, manageSavedSearchService: ManageSavedSearchService

2

Answers


  1. Chosen as BEST ANSWER
    beforeEach(async () => {
        const module: TestingModule = await Test.createTestingModule({
          providers: [EmailSubscriptionService,{
            provide: EmailSubscriptionService,
            useValue: {
              getClient: jest.fn(),
            }
          }],
        }).compile();
    
        service = module.get<EmailSubscriptionService>(EmailSubscriptionService);
      });
    

    this seems to work somehow, the service class constructor uses many other classes, but using it in provide works..it is kind of counter intuitive as the classes in constructor need to be mocked individually, but without doing that it works.


  2. If you want to mock the RedisClient in your tests you need to provide the same DI token as what you get back from @InjectRedisClient('0'). This will allow you to replace the redis client for the purposes of your test.

    I’m not familiar with the specific Redis library you’re using but assuming that it’s this one you can take a look at how the token is constructed

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search