#Unit testing a service who's module imports another module

8 messages · Page 1 of 1 (latest)

dusk lodge
#

I'm having a really hard time mocking a module in my service's unit tests. My module is very simple:

import { Module } from '@nestjs/common';
import { ReportsController } from './reports.controller';
import { ReportsService } from './reports.service';
import { FileWriterModule } from 'src/file-writer/file-writer.module';

@Module({
  imports: [FileWriterModule],
  controllers: [ReportsController],
  providers: [ReportsService],
})
export class ReportsModule {}
#

My implementation looks sorta like this:

@Injectable()
export class ReportsService {
  constructor(
    private configService: ConfigService,
    private eligibilityJournalRepository: EligibilityJournalRepository,
    private fileWriterService: FileWriterService,
  ) {}

  private logger = new Logger('ReportsService');
// etc ....
}
#

So when I try to bring this into my test suite:

import { Test, TestingModule } from '@nestjs/testing';
import { ReportsService } from './reports.service';
import { EligibilityJournalRepository } from '../eligibility/eligibility-journal.repository';
import { FileWriterService } from '../file-writer/file-writer.service';

describe('ReportsService', () => {
  let service: ReportsService;

  const eligibilityJournalRepositoryMock = {
    getEligibilityRecordsByClientIdForTimePeriod: vi.fn(),
  };

  const fileWriterServiceMock = {
    writeStreamToS3Bucket: vi.fn(),
  };

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        ReportsService,
        {
          provide: EligibilityJournalRepository,
          useValue: eligibilityJournalRepositoryMock,
        },
        {
          provide: FileWriterService,
          useValue: fileWriterServiceMock,
        },
      ],
    }).compile();

    service = module.get<ReportsService>(ReportsService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });
});

Nest cannot see that last dependency:

Error: Nest can't resolve dependencies of the ReportsService (?, EligibilityJournalRepository, FileWriterService). Please make sure that the argument ConfigService at index [0] is available in the RootTestModule context.
#

I've tried just including that FileWriterService as a mock into my providers in the mocked module. That did not work. I've tried importing the actual FileWriterModule and putting that into the imports array... but that has way too many dependencies of its own. I've tried creating a mocked version of that but I still see this error.

remote terrace
#

Where's the mock for the COnfigService?

dusk lodge
#

You're right, wrong copypasta here's the actual test:

import { Test, TestingModule } from '@nestjs/testing';
import { ReportsService } from './reports.service';
import { EligibilityJournalRepository } from '../eligibility/eligibility-journal.repository';
import { FileWriterService } from '../file-writer/file-writer.service';
import { ConfigService } from '@nestjs/config';

describe('ReportsService', () => {
  let service: ReportsService;

  const eligibilityJournalRepositoryMock = {
    getEligibilityRecordsByClientIdForTimePeriod: vi.fn(),
  };

  const fileWriterServiceMock = {
    writeStreamToS3Bucket: vi.fn(),
  };

  const configServiceMock = {
    get: vi.fn(),
  };

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        ReportsService,
        {
          provide: ConfigService,
          useValue: configServiceMock,
        },
        {
          provide: EligibilityJournalRepository,
          useValue: eligibilityJournalRepositoryMock,
        },
        {
          provide: FileWriterService,
          useValue: fileWriterServiceMock,
        },
      ],
    }).compile();

    service = module.get<ReportsService>(ReportsService);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });
});
#

Injecting that FileWriterService in the providers array should be sufficient for my SUT to see it.

#

I actually think it's just an import error! src while the root of my source code, doesn't appear to work but .. does.