Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

useUser custom hook 사용 #126

Merged
merged 9 commits into from
Mar 19, 2021
Merged

useUser custom hook 사용 #126

merged 9 commits into from
Mar 19, 2021

Conversation

jiji14
Copy link
Owner

@jiji14 jiji14 commented Feb 27, 2021

드디어 useUSer custom hook 완성했어!
다음에는 useReservationStatus 만들게!
fixes #85

@github-actions
Copy link

github-actions bot commented Feb 27, 2021

Visit the preview URL for this PR (updated for commit 5271149):

https://dailyfield-a845d--pr126-customhook-wvampcyd.web.app

(expires Fri, 26 Mar 2021 07:00:31 GMT)

🔥 via Firebase Hosting GitHub Action 🌎

@jiji14
Copy link
Owner Author

jiji14 commented Feb 27, 2021

문제가 있어! 테스트 환경에서는 firebase.auth().onAuthStateChanged user state바뀌는거 몰라
onAuthStateChanged 호출 했는지 console.log 로 찍어봤는데
로그인 후 호출 했을까? , 로그아웃 후 호출 했을까? 뒤에 호출을 안해

image

@atn832
Copy link
Collaborator

atn832 commented Feb 28, 2021

문제가 있어! 테스트 환경에서는 firebase.auth().onAuthStateChanged user state바뀌는거 몰라
onAuthStateChanged 호출 했는지 console.log 로 찍어봤는데
로그인 후 호출 했을까? , 로그아웃 후 호출 했을까? 뒤에 호출을 안해

싸인 테스트는 이렇게 돌려:

  1. await fireAntEvent.actAndClick("로그인");
  2. .signInWithPhoneNumber(proccessedPhoneNumber, appVerifier);
  3. signInWithPhoneNumber: jest.fn().mockResolvedValue({
  4. const signoutButton = screen.getByText(/SIGNOUT/i);

실제로 돌리면 signInWithPhoneNumber돌릴때 firebase의 onAuthStateChanged이 callback(user)을 돌려줘. 테스트 환경 안에 돌리면 signInWithPhoneNumber의 목을 onAuthStateChanged을 callback(user) 돌리게 해야해.

@atn832
Copy link
Collaborator

atn832 commented Feb 28, 2021

그런데 다른 방법도 있어. 어떤 컴포넌트의 테스트 쓸때 자기 의존성만 목 만들어야해. 옛날에 Header이 firebase auth에 의지 했는데 지금은 useUser에 의지 해. 그래서 제대로 테스트 고치려면 onAuthStateChanged의 목 아니라 useUser의 목 만들면 맞아.

@atn832
Copy link
Collaborator

atn832 commented Feb 28, 2021

그리고 컴포넌트 렌더 할때 마다 customHook이 돌려. 그래서 useUser목 만들면 쉽게 깔끔하게 테스트 고칠수 있어.

@jiji14
Copy link
Owner Author

jiji14 commented Mar 1, 2021

useUser의 목은 issue 따로 뺐어 #130
일단 signin, signout 했을때 onAuthStateChanged 다시 불러오게 하려고 했는데 계속 실패해...

@atn832
Copy link
Collaborator

atn832 commented Mar 4, 2021

일단 signin, signout 했을때 onAuthStateChanged 다시 불러오게 하려고 했는데 계속 실패해...

예를 들면 signin테스트에:

  1. 싸인아웃 상태라서 로그인 버튼 보여
  2. 로그인 버튼 누르고 signed in 상태로 바꿔
  3. 로그아웃 버튼 보여

이렇게 돌리면 통화해. 이렇게 하려면 onAuthStateChanged이 준 user이 바뀌어. 1.때 null user 줘야해. 3.때 진짜 user 줘야해. 근데 지금 지정 코드 보니까 1.와 3.때 똑같은 user 줘.

@jiji14
Copy link
Owner Author

jiji14 commented Mar 9, 2021

SIGNIN 버튼 클릭하면 user 다르게 주려고 코드 작성했는데
문제는 SIGNIN 버튼 클릭하고 나서 onAuthStateChanged 안돌려
콘솔로는 밑에 처럼 나와 ㅠㅠ

console.log
onAuthStateChanged

  at src/customHooks/useUser.tsx:9:13

FAIL src/components/Header.test.tsx
Test
✕ Sign In (223 ms)

● Test › Sign In

............

Watch Usage: Press w to show more. console.log
signin 성공!

  at signInWithPhoneNumber (src/components/Header.tsx:66:15)

@atn832
Copy link
Collaborator

atn832 commented Mar 10, 2021

맞아. onAuthStateChanged이 한번만 돌려. 이거는 구독하는 함수야. HTML Element의 addEventListener처럼:

const callback = (event) => { alert(event); };
document.body.addEventListener("click", callback);

addEventListener은 하번만 돌리는데 클릭 할때 마다 callback을 돌릴거야. alert dialog 여러번 보일거야.

진짜 dailyfield쓰면 싸인인 하면 onAuthStateChanged이 다시 돌리는게 아니라 onAuthStateChanged이 점긴 callback 다시 돌릴거야. callback(user) 돌릴거야. useUser 코드 보면 callback이 setUser이라서 onAuthStateChanged이 setUser(user) 돌릴거야.

그래서 목 만드려면 마찬가지 싸인 버튼 클릭 한 후에 callback을 다시 돌려야해.

다시 해볼래? 다시 해보고 아직 못 하면 올바른 코드 알려줄게!

@jiji14
Copy link
Owner Author

jiji14 commented Mar 10, 2021

그러면 내가 callback 함수를 trigger 해야되는거야??

@atn832
Copy link
Collaborator

atn832 commented Mar 10, 2021

응! trigger해봐!

@jiji14
Copy link
Owner Author

jiji14 commented Mar 11, 2021

나 여기까지 해봤어!
더이상 못하겠어.... ㅠㅠ 거의 다 온것 같은데 ㅠㅠㅠ

additionalUserInfo: { isNewUser: false },
user: {},
}),
confirm: jest.fn().mockImplementation((callback: (user: firebase.User | null) => void) => {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

어떻게 confirm돌리는지 보면 callback아니라 code 남겨:

const { user } = await confirmationResult.confirm(code);

그래서 이런 목 만들면 안 될거야.

((firebase.auth as unknown) as jest.Mock).mockReturnValue({
onAuthStateChanged: jest.fn(),
currentUser: {},
signOut: jest.fn().mockResolvedValue(null),
signOut: jest.fn().mockImplementation((callback: (user: firebase.User | null) => void) => {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Header코드 보면 signOut을 입력값 하나도 안 넘겨.

await firebase.auth().signOut();

그래서 이 목이 callback안 받을거야. 그래서 오류 날거야. 이 코드 같아:

function mockSignOut(callback) {
  callback(null);
}

mockSignOut();

돌리면 callback이 undefined이야. 그래서 callback() 돌리면 undefined() 돌릴거야. undefined이 함수 아니라서 "undefined is not a function"이라는 오류 날거야.

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 await firebase.auth().signOut(); 이부분은 이해했어!
나중에 같이 코딩할때 어떻게 풀어야되는지 알려줘! 혼자하기 너무 어려워 ㅠㅠ

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

응! 만날때 보여줄게

@@ -29,6 +31,9 @@ describe("Test", () => {

render(<Header />);
await fireAntEvent.actAndClick("SIGNIN");
await act(async () => {
if (setUser) setUser(fakeUser);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

confirm돌릴때 setUser돌려줘

});

render(<Header />);
await fireAntEvent.actAndClick("SIGNOUT");
await act(async () => {
if (setUser) setUser(null);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

signOut돌릴때 setUser(null)돌려줘

currentUser: {},
signOut: jest.fn().mockResolvedValue(null),
signOut: () => {
if (setUser) setUser(null);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUser 값 항상 있어서 if (setUser) 치워줘

user: {},
}),
confirm: () => {
if (setUser) setUser(fakeUser);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

setUser 값 항상 있어서 if (setUser) 치워줘

@jiji14 jiji14 merged commit f22174e into main Mar 19, 2021
@jiji14 jiji14 deleted the customHook branch March 19, 2021 07:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Custom Hook 만들어줘
2 participants