controller.spec.js
1. store -> 전체적으로 스키마 고객 or 사장님 처리시
Type -> isOwner 로 교체후 Test 코드에선 적용 안되어서 오류 뜬 문제 다수 발견
1.toHaveBeenCalledTimes 에서 제대로 작동되지 않는 경우가 많은데
test controller 와 src에 있는 controller 에서 req, res 하는 부분이 보통 달라서인경우가 많음
예를 들면 )
스토어 서비스 유닛 테스트 › 스토어 생성 실패 테스트
expect(jest.fn()).toHaveBeenCalledTimes(expected)
Expected number of calls: 1
Received number of calls: 0
혹은
Store Repository Unit Test › updateStore Method
expect(jest.fn()).toHaveBeenCalledWith(...expected)
- Expected
+ Received
이런 오류들인데
테스트 코드에서 1번 호출 되도록 설정 하였는데 한번도 호출되지 않았을때 나타남.
Expected: 함수가 호출될 때 특정 인자들이 전달되기를 기대했으나,
Received: 실제로 전달된 인자들이 기대와 일치하지 않음.
그래서 기대값Expected: 과 실제값Received 을 비교할 필요가 있습니다.
이과정에서 단순히 오타때문인 경우도 있고
데이터를 더 보내던 덜 보내던 하는 문제가있는경우가 많습니다.
2.user 로그인 회원가입 부분
1). store 와 고객과 사장을 나누는 부분에서 마찬가지로 const signUpRequestBodyParams 부분에서 type 으로 써져있어서 스키마 변경했던대로 isOwner로 변경 하였고
2) 오류내용
expect(jest.fn()).toHaveBeenCalledWith(...expected)
Expected: "SH@example.com", "aaaa43321", undefined
Received: "SH@example.com", "aaaa43321"
로그인 부분에서 메서드 호출시 res 파라미터가 예상한 대로 전달되지 않았습니다
기존 코드에서 logInRequestBodyParams.res 부분이 정의되어있지 않아서 undefined 으로 전달되어서 res 부분을 제거 하였습니다 .
3) 로그인 test 코드 cookie 부분 설정 수정
src 코드에서만 test 코드에서 mockResponse.cookie를 추가해서 res.cookie() 호출을 목(mock) 처리했습니다.
기존에는 src 파일에서만
const login = await this.userService.logIn(email, password);
res.cookie('authorization', `Bearer ${login}`); 처럼 쿠키 설정이 되어있었습니다.
3.review.controller
1).전체적으로 오타 부분 toHaveBeenCallWith 에서 toHaveBeenCalledWith 으로 바구었고
2).message: 부분도 띄어쓰기 같은것도 같게 해야 오류가 안나는 것도 확인후 변경
3).mockRequest.status도 mockResponse.status 로 변경 해서 오류 수정했습니다 .
4).expect(mockReviewService.deleteReview).toHaveBeenCalledWith(
mockRequest.user.userId, // userId 추가
deleteReviewRequestBodyParams.reviewId
);
에서 userId 값이 누락되어있어서 모두 추가 해넣었습니다
5).순서 부분인데 createReview 와 updateReview 부분에서 인자값을 순서대로 받아야 하는데 그렇지 않게 되있어서 수정했습니다.
serId, storeId, comment, rate 순으로 인자를 받아야 합니다.
6). status: jest.fn().mockReturnValue({ json: jest.fn() }),
7).const mockReviewService = {
createReview: jest.fn(),
updateReview: jest.fn(),
deleteReview: jest.fn(),
};
에서 딜리트 부분 jest 추가 했습니다.
4.menu.controller test
1. const mockMenuService = {
createMenu: jest.fn(),
updateMenu: jest.fn(),
deleteMenu: jest.fn(),
};
에서 deleteMenu: jest.fn(), 부분 추가했습니다.
2.
const mockRequest = {
body: {},
user:{},
}; 에서 jest.fn(), 대신 {} 로받아오는것으로 수정했는데 req 에선 (jest.fn는 함수 호출을 추적할때 사용하는데 여기선 필요없음)
필요하지 않아서 제거 했습니다.
res.json()이나 res.status() 같은 응답 메서드의 호출 여부를 확인하려면, jest.fn()을 사용해야 한다고 합니다.
3. test 코드 들에서 mockRequest.body = createMenuRequestBodyParams;
에서 mockRequest.user = { userId: 1, isOwner: true }; 추가해서 유저 정보를 추가했습니다 .
4. 마찬가지로
createdAt: new Date().toString(),
updatedAt: new Date().toString(),
에서 toString 을 toString() 로 수정했습니다.
5.업데이트 파람스에서 마찬가지로 Type -> isOwner 로 바꾸고 파람스에서 객체 menuId 추가해서 정상적으로 받게 했습니다.
2.repositories
1. menu.repository Test
1) FindMenuName 에서 where 부분이 달랐는데 수정 해주었고 일치하도록
레퍼지 토리에서 test 부분에서
test('FindMenuName Method By Success', async () => {
// 1. FindMenuName 메서드의 반환값을 설정한다.
const mockReturn = 'find MenuName';
mockPrisma.menu.findUnique.mockReturnValue(mockReturn);
// 2. findStoreIdByUserId 메서드를 실행하기 위한 userId 데이터 전달
const findStoreIdParams = {
storeId: 1,
menuName: 'Find MenuName Test',
};
const findMenuNameData = await menuRepository.findMenuNameByStoreId(
findStoreIdParams.storeId,
findStoreIdParams.menuName,
);
expect(findMenuNameData).toEqual(mockReturn);
expect(mockPrisma.menu.findUnique).toHaveBeenCalledTimes(1);
expect(mockPrisma.menu.findUnique).toHaveBeenCalledWith({
where: {
storeId_menuName: { storeId: findStoreIdParams.storeId, menuName: findStoreIdParams.menuName },
},
});
});
에서 findMenuNameByStoreId 부분과
src 파일에서 findMenuNameByStoreId = async (storeId, menuName) => {
const menu = await this.prisma.menu.findUnique({
where: {
storeId_menuName: { storeId: +storeId, menuName },
},
});
return menu;
};
findStoreIdByUserId = async (userId) => {
const store = await this.prisma.store.findFirst({
where: { userId: userId },
});
return store;
};
에서 findMenuNameByStoreId 을 일치 시켜야 합니다 라이브 쉐어 공동작업시 특히 조심 해야합니다.
2. 업데이트 부분 오류내용
expect(jest.fn()).toHaveBeenCalledWith(...expected)
- Expected
+ Received
Object {
"data": Object {
- "image": "변경할 이미지 URL",
- "menuName": "더 맛있는 육계장 사발면",
- "price": 1200,
- "stock": 100,
+ "image": "더 맛있는 육계장 사발면",
+ "menuName": "육개장 사발면",
+ "price": "변경할 이미지 URL",
+ "stock": 1200,
},
"where": Object {
- "menuName": "육개장 사발면",
- "storeId": 1,
+ "menuId": 1,
},
},
에서 마찬가지로 기대한 값과 받은 값이 달라서 벌어지는데 순서와 정확한 인자값이 전달되는지 확인해야합니다.
정확히 해당 필드로 전달해야합니다.
따라서 해당 값들 순서와 벨류값 일치 시키고
storeId 로 잘못 기입되어있는것 menuId 로 수정했습니다.
3. 기존 const mockReturn = 'update Menu'; 로만 되어있는것을 객체로 받기위해
const mockReturn = {
menuId: 1,
menuName: '더 맛있는 육계장 사발면',
image: '변경할 이미지 URL',
price: 1200,
stock: 100,
};
이후 바로 아래
mockPrisma.menu.update.mockReturnValue(mockReturn);
를 이용하여 // Prisma의 update 메서드가 mockReturn 객체를 반환하도록 설정합니다.
2.store.repository 테스트
1.기능 구현에 location 을 추가하고 test 부분에는 추가 하지 않아서 발생하는 오류 해결.
expect(jest.fn()).toHaveBeenCalledWith(...expected)
- Expected
+ Received
Object {
"data": Object {
- "foodType": "createFoodType",
- "location": undefined,
+ "foodType": 0,
+ "location": "createFoodType",
"sales": 0,
"storeName": "createStoreName",
"userId": 1,
},
},
이런식으로 오류가 생성됩니다.
2. 마찬가지로 기능 구현에 storeId 를 추가 하고 Test 에 추가 하지 않은 부분 발견해서 추가 했습니다.
3.findMenuByStoreId 부분에서 where 과 select 가 Test 구현 쪽에서 구분되어있지 않아서 구분 하여 오류 수정했습니다
expect(jest.fn()).toHaveBeenCalledWith(...expected)
- Expected
+ Received
"menuName": true,
"price": true,
"stock": true,
},
"where": Object {
- "sstoreId": 1,
+ "storeId": 1,
},
}, 오류는 이런식으로 나옵니다.
3.user.repository
1. type 에서 유저 생성 부분 마찬가지로 isOwner 로 교체 후 오류 수정되었습니다.
3. services contoroller Test 부분
1. menu.service.spec
1)create
1. findMenuNameByStoreId 로 온전히 진행되게 수정하였고 findMenuNameByStoreId: jest.fn(), 도 같이 추가해줘야합니다.
2.storeId 부분도 userId로 바꿨습니다.
2) update부분
1.findStoreIdByUserId에 userId가 전달되고, findMenuByMenuId에서는
storeId와 menuId가 제대로 전달되도록 수정했습니다.
2. 실패 부분에서 서비스 코드와 일치하는 메서드 이름을 사용하는 부분에서 오류가 생겼습니다 .
1)expect(mockMenuRepository.findMenuByMenuId).toHaveBeenCalledTimes(1);
expect(mockMenuRepository.findMenuByMenuId).toHaveBeenCalledWith(1, 1);
로 가져오는 부분에서 서비스 로직에서 작성한 메서드 이름을 동일하게 사용해야합니다.
2)await menuService.updateMenu(1, 1, 'menuName', 'imageURL', 1000, 10); 로 매개변수를 추가해야합니다.
2.store.service.spec.js
1)스토어 업데이트 성공 테스트
1. 프로젝트 중간에 테이블 추가로 인한
storeId,userId 값을 제대로 받아오지 못하는부분을 추가해서 수정했습니다
2)스토어 삭제 성공 테스트
1. 메서드에서 전달하는 값과 일치하는 매개변수를 전달 해야 하고
2.storeName 을 로직과 일치하게 테스트 코드에서 제거 했습니다 .
3)스토어 목록 조회 성공 테스트
1.서비스 코드에서 findStoreByStoreName 를 호출 할때 storeName 을 전달하지 못한 것 수정했습니다.
2.
expect(getStore).toEqual({
store: sampleStore,
// store 속성으로 감싸서 반환됨
});
부분에서 store 값을 감싸서 Test 를 해야 하는 부분 수정했습니다.
3. 서비스 로직에서 음식점이 아예 존재하지 않을시 에러 보내는 부분 추가했습니다 .
4) 스토어 생성 실패 테스트
1. 해당하는 음식점이 없습니다. 가 일치되게 로직메세지 문자를 수정했습니다.
3. user.service.unit.spec Test
1회원가입 부분 마찬가지로 Type -> isOwner 로 바꿔주니 해결되었고
2. 로그인부분 JWT_SECRET 변수 전달 문제가 있어서 추가했습니다.
JWT 토큰 로그인시 모킹 해주었고
bcrypt.compare 를 추가해서 입력한 비밀번호화 해시된 번호 비교하였습니다.
일치시 true 불일치시 false
'Daily Logs > TIL (Today I Learned)' 카테고리의 다른 글
스웨거 활용법 (0) | 2024.11.08 |
---|---|
와이어 프레임의 중요성 (1) | 2024.10.21 |
메모리(Memory)란 ? (1) | 2024.10.08 |
JavaScript 실력을 올려줄 다양한 지식들 part 5 (1) | 2024.09.30 |
JavaScript 실력을 올려줄 다양한 지식들 part 4 (2) | 2024.09.26 |