jest.mock("../models/user");
// require을 통해 가지고 오는 객체들을 jest.mock으로 복사한다.
const User = require("../models/user");
const {addFollowing} = require("./user");
describe("addFollowing", ()=>{
const req = {
user : {id : 1},
params : {id : 2},
};
const res = {
status : jest.fn(()=>res),
send : jest.fn(),
};
const next = jest.fn();
const console = {
error : jest.fn(),
};
test("사용자를 찾아 팔로잉을 추가하고 success를 응답해야 함", async()=>{
User.findOne.mockReturnValue(Promise.resolve({
addFollowing(id) {
return Promise.resolve(true);
}
}));
await addFollowing(req,res,next);
expect(res.send).toBeCalledWith('success');
});
test("사용자를 못 찾으면 res.status(404).send(no user)를 호출해야 함", async ()=>{
User.findOne.mockReturnValue(Promise.resolve(null));
await addFollowing(req.res,next);
expect(res.status).toBeCalledWith(404);
expect(res.send).toBeCalledWith('no user');
});
test("DB에서 에러가 발생하면 next(error) 호출한다.", async()=>{
const err = "테스트용 에러";
User.findOne.mockReturnValue(Promise.reject(err));
await addFollowing(req,res,next);
expect(console.error).toBeCalledWith(err);
expect(next).toBeCalledWith(err);
});
}
위의 코드는 user.test.js 코드입니다.
user.js 코드는 깃헙에 올려주신 코드를 복사했습니다.
console.error()를 테스트 하기 위해 가짜객체도 만들었습니다.
test("사용자를 못 찾으면 res.status(404).send(no user)를 호출해야 함"
이 부분에서 Promise.resolve(null)을 했는데 테스트가 왜 try{} 부분이 아니라 catch{} 부분으로
가는 걸까요??
catch{} 부분에서 console.error(err) 부분도 처리가 안되고 , next(err) 부분도 테스트가 안됩니다.
next(err)에서 next가 함수가 아니라고 타입 에러가 뜨는데 왜일까요?
콘솔창의 출력은 다음과 같습니다.
혹시나 하는 마음에 user.js 코드도 아래에 올리겠습니다.
const User = require('../models/user');
exports.addFollowing = async (req, res, next) => {
try {
const user = await User.findOne({ where: { 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 (err) {
console.error(err);
next(err);
}
};
ㅎㅎㅎ
ㅎㅎㅎ