인프런 커뮤니티 질문&답변

bemodesty306님의 프로필 이미지
bemodesty306

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

데이터베이스 모킹하기

mockReturnValue 질문

작성

·

208

0

db 에러가 발생하면 next(error) 호출부분 질문드립니다. 

User.findOne부분을 mocking해서 reject를 반환하게 해서 에러처리하는 부분을 테스트하는것으로 이해를 하고 있습니다.

user 컨트롤러에서 findOne이 reject를 반환하니, 

User.findOne({where: {id : req.user.id}});

이 controller 코드에서 req.user.id가 필요없다고 생각하여  req 객체를 빈 객체로 만들고 테스트를 진행하니, req.user가 undefined라는 에러가 나오며 테스트가 실패하였습니다. 

이 부분을 혹시 User.findOne 부분을 mocking 하더라도 findOne 함수 실행을 끝까지 하고 reject를 반환한다고 이해해도 되는것일까요?

 

  test("db 에러 발생하면 next(error)호출", async () => {
    const error = "error for test";
    User.findOne.mockReturnValue(Promise.reject(error));
    await addFollowing(req, res, next);
// req = {}로 넣어도 되지 않을까?
    expect(next).toBeCalledWith(error);
});
 
//////////////////////////////
exports.addFollowing = async (req, res, next) => {
  try {
//질문대상인 User.findOne
    const user = await User.findOne({ where: { id: req.user.id } }); // req.user가 :id 사람을 팔로잉 한다.
    if (user) {
      await user.addFollowing(parseInt(req.params.id, 10));
      res.send("success");
    } else {
      res.status(404).send("no user");
    }
  } catch (error) {
    console.error(error);
    next(error);
  }
};
 

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

User.findOne({where: {id : req.user.id}});

코드의 실행 순서를 잘 생각해보세요.

req.user.id 값에 대한 접근이 findOne 함수 호출보다 먼저 일어납니다.

req.user.id에서 에러가 발생하니 findOne은 호출조차 되지 않습니다.

bemodesty306님의 프로필 이미지
bemodesty306

작성한 질문수

질문하기