-
Jest private method mockingNode 2024. 12. 11. 21:38
Object.getPrototypeOf()
Object.getPrototypeOf() 를 사용하면 인스턴스의 원형에 접근할 수 있어 private 메서드도 mocking 할 수 있다.
class MyClass { private myPrivateMethod(): string { return 'Original Private Method'; } public callPrivateMethod(): string { return this.myPrivateMethod(); } } describe('MyClass', () => { it('should mock private method using `Object.getPrototypeOf`', () => { const myInstance = new MyClass(); const prototype = Object.getPrototypeOf(myInstance); const spy = jest.spyOn(prototype as any, 'myPrivateMethod').mockReturnValue('Mocked Private Method'); const result = myInstance.callPrivateMethod(); expect(spy).toHaveBeenCalled(); expect(result).toBe('Mocked Private Method'); }); });
- 장점: 타입 시스템을 유지하며, 프로토타입 체인을 이용해 안정적으로 접근할 수 있다.
- 단점: 약간의 복잡함이 있다.
DI
nestjs 의 경우 class 가 모듈화 되어있어 DI 를 활용하여 해결할 수 있다.
import { Injectable } from '@nestjs/common'; @Injectable() class HelperService { myHelperMethod(): string { return 'Original Helper Method'; } } @Injectable() class MyService { constructor(private readonly helperService: HelperService) {} public callPrivateMethod(): string { return this.helperService.myHelperMethod(); } }
import { Test, TestingModule } from '@nestjs/testing'; import { MyService } from './my-service'; import { HelperService } from './helper-service'; describe('MyService', () => { let myService: MyService; let helperService: HelperService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [MyService, HelperService], }).compile(); myService = module.get<MyService>(MyService); helperService = module.get<HelperService>(HelperService); }); it('should call myHelperMethod and return the mocked result', () => { // 모킹 (mocking) 처리 jest.spyOn(helperService, 'myHelperMethod').mockReturnValue('Mocked Helper Method'); const result = myService.callPrivateMethod(); expect(helperService.myHelperMethod).toHaveBeenCalled(); expect(result).toBe('Mocked Helper Method'); }); });
- 설명
- HelperService 는 MysSevercie 의 private 메서드에 해당한다.
- DI 로 주입한 HelperSevice 는 독립된 서비스이므로, 재사용이 가능하고 직접 모킹이 가능하다.
- 장점: 타입 시스템을 깨뜨리지 않으며 유지보수가 쉽다.
- 단점: 의존성을 추가해야 하므로 구조에 따라 코드 리펙터링이 필요하다.
'Node' 카테고리의 다른 글
Nestjs Request Lifecycle (0) 2024.11.24 Nestjs Lifecycle 과 Event hooks (0) 2024.11.19 Jest timeout 설정 (0) 2024.11.10 TypeError [ERR_INVALID_ARG_TYPE]: The “path” argument must be of type string. Received type undefined raised when starting react app (0) 2021.04.27