개인 프로젝트를 시작하고 얼마 되지 않아 회원가입/로그인 기능을 막 완성하고 테스트 코드를 작성하는 중에 마주한 에러에 대해 글을 남기려 한다.
class SignInViewTest(TestCase):
def setUp(self):
User.objects.create(
email = "lee@wemail.com",
password = "lizzyLee@00"
)
def tearDown(self):
User.objects.all().delete()
def test_success_signin(self):
client = Client()
body = {
"email" : "lee@wemail.com",
"password" : "lizzyLee@00"
}
response = client.post("/users/signin", json.dumps(body), content_type="application/json")
self.assertEqual(response.status_code, 200)
맨 처음 내가 짰던 테스트 코드이다. 작성을 하고 "python manage.py test users" 명령어로 실행을 시켰더니 예상치 못한 에러가 발생했다.
....!?!?!
invalid salt는 뭐야....
찾아보니 같은 에러를 마주한 사람이 역시 있었다. -> 링크
알아보니 DB에 들어가는 데이터를 다시 decode해주어야 한다는 것!
salt = bcrypt.gensalt()
encoded_password = password.encode("utf-8")
hashed_password = bcrypt.hashpw(encoded_password, salt)
User.objects.create(
name = name,
nickname = nickname,
email = email,
password = hashed_password.decode("utf-8"),
phone_number = phone_number
)
위에 보이는 것이 내가 views.py에서 작성한 코드이다. encode해서 hashpw()에, decode해서 DB에 저장하듯이 test DB에 test data들도 이와 같이 해야한다는 말 같다.
class SignInViewTest(TestCase):
def setUp(self):
User.objects.create(
email = "lee@wemail.com",
password = bcrypt.hashpw("lizzyLee@00".encode("utf-8"), bcrypt.gensalt()).decode("utf-8")
)
상단의 코드가 이후에 수정한 코드.
저장하고 다시 돌려보니, 결과는 아래와 같다!!