ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nestjs에서 테스트 코드 작성시 Nest can't resolve dependencies in the RootTestModule context 에러
    Nest.js/TDD 2024. 1. 9. 20:57
    728x90
     Nest can't resolve dependencies of the ApmService (?). Please make sure that the argument dependency at index [0] is available in the RootTestModule context.
    
        Potential solutions:
        - If dependency is a provider, is it part of the current RootTestModule?
        - If dependency is exported from a separate @Module, is that module imported within RootTestModule?
          @Module({
            imports: [ /* the Module containing dependency */ ]
          })

     

    ● ApmService › should be defined
    
        expect(received).toBeDefined()
    
        Received: undefined
    
          56 | 
          57 |   it("should be defined", () => {
        > 58 |     expect(service).toBeDefined();
             |                     ^
          59 |   });
          60 | 
          61 |   it("start should be called", () => {
    
          at Object.<anonymous> (libs/lib1/src/lib1.service.spec.ts:58:21)

     

    toBeDefined로 제대로 정의 되어 있는지 검증하는 테스트 코드를 작성 했으나

    의존성 추가 에러 에러가 발생했다.

     

    처음엔 기존에 테스트 코드 작성하기전 해결 했던 방식대로 해당 모듈에서 필요한 provider를 추가 해서 해결 하려고 했으나
    해결되지 않았다.
    Test.createTestringModule 함수는 실제 module.ts파일과 아무런 연관이 없었다!!!
    그렇다면 module.ts에 providers에 추가 해주지 않았는데도 왜 동작이 안하는건지 이해가 안됬다.

     

     

    여러번의 삽질 결과 예를들어 AmpService를 Test.createTestingModule에 providers에 추가해서 해당 AmpService에 대한 단위 테스트를 진행 할때 조심해야 되는게 있었다.

    바로 해당 AmpService에서 만약에 의존성을 주입 해놓은 무언가가 있다면 그것또한

    Test.createTestingModule에 선언 해주어야한다!!!

     

    @Injectable()
    export class AmpService {
    	constructor(
        	private readonly ampRepository:AmpRepository
        ){}
     ... 중략
    }

     

    이런식으로 constructor에 의존성 주입을 받은게 있다면 그것또한 Test.createTestingModule에 추가 해주어야함.

     

    describe('CurrenciesService', () => {
    	let service: CurrenciesService;
    	let repository: CurrenciesRepository;
    	let mockData: Currencies;
    
    	beforeEach(async () => {
    		const currenciesRepositoryMock = {
    			getCurrency: jest.fn(),
    			createCurrency: jest.fn(),
    			updateCurrency: jest.fn(),
    			deleteCurrency: jest.fn(),
    		};
    		const module: TestingModule = await Test.createTestingModule({
    			providers: [
    				CurrenciesService,
    				{
    					provide: CurrenciesRepository,
    					useFactory: () => currenciesRepositoryMock,
    				},
    			],
    		}).compile();
    
    		service = module.get<CurrenciesService>(CurrenciesService);
    		repository = module.get<CurrenciesRepository>(CurrenciesRepository);
    		mockData = { currency: 'USD', value: 1 };
    	});
    
    	it('should be defined', () => {
    		expect(service).toBeDefined();
    	});
        
     });
     
     // CurrenciesService에서 CurrenciesRepository를 의존성 주입을 받아서 사용하고 있어서
     // 해당 CurrenciesRepository를 privider에 추가해준 모습
    728x90
Designed by Tistory.