ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Jest private method mocking
    Node 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 는 독립된 서비스이므로, 재사용이 가능하고 직접 모킹이 가능하다.
    • 장점: 타입 시스템을 깨뜨리지 않으며 유지보수가 쉽다.
    • 단점: 의존성을 추가해야 하므로 구조에 따라 코드 리펙터링이 필요하다.
Designed by Tistory.