프리미엄 버전 구매와 관련된 통합 테스트 코드를 작성하면서, 새로운 유저를 생성할 때마다 동일한 id를 가질 경우 UNIQUE 규칙에 맞지 않아 유저 생성이 되지 않는 문제가 발생했다. 아이디를 다르게 설정하면 해결되긴 하지만 독립적으로 테스트를 실행시켜보고 싶다는 생각이 들어 트랜잭션을 활용해보았다.
beforeAll
, afterAll
에서 queryRunner
를 연결하고 해제하는 작업 진행
beforeEach
에서 트랜잭션 시작, afterEach
에서 트랜잭션 롤백 및 Mocking 제거
beforeAll(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [TypeOrmModule.forRoot(typeORMTestConfig)],
providers: [PurchaseService, PurchaseRepository, UsersRepository],
}).compile();
purchaseService = moduleFixture.get<PurchaseService>(PurchaseService);
dataSource = moduleFixture.get<DataSource>(DataSource);
queryRunner = dataSource.createQueryRunner();
await queryRunner.connect();
});
beforeEach(async () => {
await queryRunner.startTransaction();
});
afterEach(async () => {
await queryRunner.rollbackTransaction();
jest.restoreAllMocks();
});
afterAll(async () => {
await queryRunner.release();
});
queryRunner.manager
가 실행할 수 있도록 Mocking이 필요하여 Mocking 코드가 굉장히 많습니다..!→ 라이브러리로 해결!
typeorm-transactional-tests 라이브러리 톺아보기!
beforeEach
메소드에서 연결된 커넥션 객체를 기준으로 트랜잭션을 생성 및 시작beforeEach
에 생성한 트랜잭션 기준으로 실행afterEach
메소드에서는 트랜잭션을 롤백시키고 커넥션을 반환Connection
-> DataSource
로 사용