Test-Driven Development (TDD)는 소프트웨어 개발 방법론 중 하나로, 테스트 코드를 작성하고 그 후에 실제 코드를 작성하는 접근 방식
// payments.service.spec.ts
describe('PaymentsService', () => {
let app: TestingModule;
let paymentsService: PaymentsService;
// beforeEach - 각 테스트 케이스가 수행되기 전에 필요한 코드 작성 (module 의존성 정의 및 service 객체 생성 등), 필요에 따라 beforeAll로 대체
beforeEach(async () => {
app = await Test.createTestingModule({
imports: [AppModule],
}).compile();
paymentsService = app.get<PaymentsService>(PaymentsService);
});
// afterEach - 각 테스트 케이스가 수행 완료된 후 처리할 코드 작성, 필요에 따라 afterAll로 대체
afterEach(() => {
app.close();
});
// 테스트 명세 정의
describe('[Payments]', () => {
// 테스트 코드 작성
test('.register 결제 등록 서비스', async () => {
// mock data 정의
const data = {
method: 0,
orderList: [
{
productId: 1,
count: 5,
},
{
productId: 3,
count: 2,
},
{
productId: 2,
count: 3,
},
],
} as Payments;
data.memberId = 1;
data.createdBy = 'system';
// service unit 테스트 결과에 따른 예상되는 결과를 toMatchObject로 비교
expect(await paymentsService.register(data)).toMatchObject({
orderId: expect.anything(), // uuid
orderName: 'Velostar Share 2.0 외 2건',
amount: 10050000,
customerEmail: undefined,
customerName: undefined,
});
});
test('.register 결제 등록 서비스 - 예외 케이스 1 : 유효하지 않은 productId', async () => {
const data = {
method: 0,
orderList: [
{
productId: 100,
count: 5,
}
],
} as Payments;
data.memberId = 1;
data.createdBy = 'system';
await expect(paymentsService.register(data)).rejects.toEqual(new InternalServerErrorException('Transaction Fail.'));
});
});
});

describe('AppController (e2e)', () => {
let app: INestApplication;
let adminAuth;
let businessAuth;
let memberAuth;
let membersService;
let membersBusinessService;
let businessDetailsService;
beforeAll(async () => {
const moduleRef: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile();
membersService = moduleRef.get<MembersService>(MembersService);
adminAuth = await membersService.signIn({
identifier: 'superAdmin@blockodyssey.io',
password: 'test123!',
} as Members);
businessAuth = await membersService.signIn({
identifier: 'testVehicleE@blockodyssey.io',
password: 'test123!',
} as Members);
memberAuth = await membersService.signIn({
identifier: 'testMemberE@blockodyssey.io',
password: 'test123!',
} as Members);
membersBusinessService = moduleRef.get<MembersBusinessService>(MembersBusinessService);
businessDetailsService = moduleRef.get<BusinessDetailsService>(BusinessDetailsService);
app = moduleRef.createNestApplication();
await app.init();
});
afterAll(() => {
app.close();
});
describe('[Auth]', () => {
test('회원 가입', () => {
return request(app.getHttpServer())
.post('/members/signUp')
.send({
members: {
identifier: 'newUser@blockodyssey.io',
password: 'test123!',
},
})
.expect(201);
});
test('회원 가입 - 이메일 중복', () => {
return request(app.getHttpServer())
.post('/members/signUp')
.send({
members: {
identifier: 'admin@blockodyssey.io',
password: 'test123!',
},
})
.expect(409);
});
test.skip('회원 인증', () => {
return request(app.getHttpServer())
.post('/members/verify')
.send({
members: {
verifyKey: '$2b$10$qYXQiBx0ti0iJYi6j5O.t.dZFCin6JWw2vyTxvVYbuTfstn/AdsJ2',
},
})
.expect(201);
});
});
});
