Skip to content

단위 테스트

sieun edited this page Dec 4, 2024 · 1 revision

단위 테스트

저희 프로젝트는 service 레이어에 핵심 로직이 많이 분포되어 있다고 판단하고, 단위 테스트를 service 레이어를 대상으로 진행하기로 결정했습니다.

jest로 테스트 코드를 작성하던 중, service 레이어가 주입 받는 repository나 다른 service를 어떻게 처리해야 할 지 고민이 있었습니다.

testing module을 통해 의존성을 주입하게 되면, 주입된 서비스의 의존성도 주입해야 하는 매우 귀찮은 문제가 생겼습니다.

그래서 아래와 같이 testing module을 만드는 시점에서, repository 및 다른 service 들을 모킹해서 주입해주기로 결정했습니다.

describe('stock order test', () => {
  let stockOrderService: StockOrderService;
  let stockOrderRepository: StockOrderRepository;
  let assetRepository: AssetRepository;
  let userStockRepository: UserStockRepository;

  beforeEach(async () => {
    const mockStockOrderRepository = { // stockOrderRepository mocking
      findBy: jest.fn(),
      save: jest.fn(),
      create: jest.fn(),
      findOneBy: jest.fn(),
      remove: jest.fn(),
      existsBy: jest.fn(),
    };
    const mockAssetRepository = { findOneBy: jest.fn() }; // assetRepository mocking
    const mockStockPriceSocketService = { // stockPriceSocketService mocking
      subscribeByCode: jest.fn(),
      unsubscribeByCode: jest.fn(),
    };
    const mockUserStockRepository = { findOneBy: jest.fn() }; // userStockRepository mocking

    const module = await Test.createTestingModule({
      providers: [
        StockOrderService,
        { provide: StockOrderRepository, useValue: mockStockOrderRepository },
        { provide: AssetRepository, useValue: mockAssetRepository },
        {
          provide: StockPriceSocketService,
          useValue: mockStockPriceSocketService,
        },
        { provide: UserStockRepository, useValue: mockUserStockRepository },
      ],
    }).compile();

    stockOrderService = module.get(StockOrderService);
    stockOrderRepository = module.get(StockOrderRepository);
    assetRepository = module.get(AssetRepository);
    userStockRepository = module.get(UserStockRepository);
  });

위와 같이 모킹을 진행한 뒤, 아래와 같이 각 테스트에서 특정 메소드의 리턴 값을 지정해줄 수 있었습니다.

it('충분한 자산을 가지고 특정 주식에 대해 매수를 요청할 경우, 요청이 DB에 정상적으로 등록된다.', async () => {
    jest.spyOn(assetRepository, 'findOneBy').mockResolvedValue({
      id: 1,
      user_id: 1,
      stock_balance: 0,
      cash_balance: 1000,
      total_asset: 1000,
      total_profit: 0,
      total_profit_rate: 0,
    });
    
    // 나머지 테스트 코드...
 });

테스트 결과

image

Test Coverage

단위 테스트를 진행한 service 레이어에 대한 test coverage는 다음과 같습니다.

File % Stmts % Branch % Funcs % Lines Uncovered Line #s
asset.service.ts 85.71 50 68.42 85.24 100-104,158-168
stock-bookmark.service.ts 100 100 100 100  
stock-detail.service.ts 94 60 90.9 95.65 111,132
stock-index.service.ts 88.57 50 83.33 87.87 59-68,118
stock-order.service.ts 84.31 90 60 85.41 119-142
stock-topfive.service.ts 81.57 20 100 80.55 34-43
stock-trade-history.service.ts 100 100 100 100  

📜 개발 일지

⚠️ 트러블 슈팅

❗ 규칙

🗒️ 기록

기획
회의록
데일리스크럼
그룹 멘토링
그룹 회고

😲 개별 멘토링

고동우
김진
서산
이시은
박진명
Clone this wiki locally