-
Notifications
You must be signed in to change notification settings - Fork 9
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
refactor: 테스트 리팩토링 #99
Conversation
const { script, eventListeners } = mockScriptElement(); | ||
|
||
vi.spyOn(document, 'createElement') | ||
.mockReturnValueOnce(script) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mockScriptElement 라는 이름이 document.createElement 를 mocking 한다는걸 드러내는게 아닐까요?
그래서 이 함수 내부에서 아래 로직도 함께 처리해줄거라고 기대할 것 같아요~
vi.spyOn(document, 'createElement')
.mockReturnValueOnce(script)
그리고 eventListeners 는 없애도 되지 않을까요? 두가지 역할을 하고 있는데, 이벤트 핸들러 hijacking 없이도 trigger 를 할 수 있는 방법이 있어서요~
- load script 가 등록하는 이벤트 핸들러 hijacking
- 해당 이벤트 핸들러를 테스트에서 직접 trigger
// load 이벤트를 script 태그에 전달
script.dispatchEvent(new Event('load'))
// error 이벤트를 script 태그에 전달
script.dispatchEvent(new Event('error'))
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mockScriptElement 라는 이름이 document.createElement 를 mocking 한다는걸 드러내는게 아닐까요?
그래서 이 함수 내부에서 아래 로직도 함께 처리해줄거라고 기대할 것 같아요~
mocking을 유틸 밖으로 뺀 이유는 아래처럼 script 생성이 여러번 될 때의 테스트를 작성하기 위함이었는데, 성현님 말씀대로 mocking 동작이 mockScriptElement
밖에서 처리되는 게 많이 이상하긴 하네요~ 현재는 위 요구사항이 필요한 테스트는 없지만, 생긴다고 해도 mockScriptElement
유틸 내부에서 독립적으로 처리할 수 있는 방법을 찾아 적용해야 할 것 같네요! 감사합니다~ 👍 b357b7e
const { script: script1 } = mockScriptElement();
const { script: script2 } = mockScriptElement();
vi.spyOn(document, 'createElement')
.mockReturnValueOnce(script1)
.mockReturnValueOnce(script2);
그리고 eventListeners 는 없애도 되지 않을까요?
요건 dispatchEvent 메소드 생각을 못했습니다ㅋㅋ.. 훨씬 좋네요! f557119
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mocking을 유틸 밖으로 뺀 이유는 아래처럼 script 생성이 여러번 될 때의 테스트를 작성하기 위함이었는데, 성현님 말씀대로 mocking 동작이 mockScriptElement 밖에서 처리되는 게 많이 이상하긴 하네요~
아하, 전 요것도 시나리오를 나눠보면, 아래처럼 mocking 시점을 분리해서 해결할 수 있지 않을까? 생각하긴 했어요~ 만약 안된다면 다른 방법을 찾아보긴 해야겠네요 😄
const failed = mockScriptElement();
failed.script.dispatchEvent(...)
// retry 전에 setup
const success = mockScriptElement();
success.script.dispatchEvent(...)
* feat: TossPayments browser-sdk V2 (#94) * feat: tosspayment browser sdk v2 스캐폴딩 * chore: public-interface를 import 하기 위해 npm 개발망 바라보게 수정 * chore: typescript version up to 5.2.2 * chore: yarn version 3.6.4 & yarn dlx update * chore: TossPayment namespace type declare * rename * chore: package json update * chore(release): publish [skip ci] - @tosspayments/[email protected] * rename * chore: 불필요한 dependency dev로 옮기기 * rename * rename * feat: ANONYMOUS PI에 정의한 상수로 내보내기 * test: 테스트 추가 * chore: ANONYMOUS 내보내야 해서 dependecy로 승격 * chore: ANONYMOUS는 SDK에서 내보내주고 있어서 browser-sdk에서 내보내줄 필요 없음 * chore: typescript version up to 5.2.2 all packages * chore: TossPayments 글로벌 타입 하드코딩 제거 * chore: @ts-ignore * chore: readme 수정 * test: 테스트 삭제 (vitest로 교체 예정) * chore: 테스트 도구 jest -> vitest로 변경 * test: v2 tosspayment sdk 테스트 작성 * chore: v1 payment 테스트 수정 * chore: test CI 깨지는 곳 수정 * chore: CI의 node version을 변경합니다 * BREAKING CHANGE(sdk-loader): loadScript v2 (#95) * chore: typescript version up * chore: ts가 __dirname 못 읽는 이슈 * feat: 테스트 요구사항 작성 * test: script 로드가 완료되면, 주어진 namespace에 생성된 인스턴스와 동일한 인스턴스를 resolve 해야한다 * test: script.onload가 안돼서, 이벤트리스너를 mocking 합니다 * test: SDK가 인스턴스를 생성하고 -> script 로드 가 알맞은 순서 * feat: script 로드가 완료되면, 주어진 namespace에 생성된 인스턴스와 동일한 인스턴스를 resolve 해야한다 * test: script 로드를 실패하면, Promise를 초기화하고 에러를 throw 해야한다 * feat: script 로드를 실패하면, Promise를 초기화하고 에러를 throw 해야한다 * test: script 로드를 성공했지만 namespace에 인스턴스가 존재하지 않으면, 에러를 throw 해야한다 * feat: script 로드를 성공했지만 namespace에 인스턴스가 존재하지 않으면, 에러를 throw 해야한다 * chore: test namespace 변경 * feat: document.head.appendChild 추가하고 테스트에선 동작 안하게 모킹 * test: 캐시된 script 로더 Promise가 존재하면, 해당 Promise를 반환해야 한다 * feat: 캐시된 script 로더 Promise가 존재하면, 해당 Promise를 반환해야 한다 * refactor: 공통 테스트 모킹 로직 beforeEach로 뺌 * test: 캐시된 script 로더 Promise가 존재하지 않으면, SSR 환경이면 null을 resolve 해야한다 * faet: 캐시된 script 로더 Promise가 존재하지 않으면, SSR 환경이면 null을 resolve 해야한다 * tset: 주어진 namespace에 인스턴스가 존재하면, 해당 인스턴스를 resolve 해야한다 * feat: 주어진 namespace에 인스턴스가 존재하면, 해당 인스턴스를 resolve 해야한다 * chore: edit gitignore * chore: given when then * test: priority 옵션을 설정하면, script element의 fetchPriority 속성이 설정되어야 한다 * feat: priority 옵션을 설정하면, script element의 fetchPriority 속성이 설정되어야 한다 * refactor: 코드 가독성 * feat: Promise가 reject 됐을때 cachedPromise가 null로 reset 되도록 합니다 * feat: 기존 src를 가진 script가 존재하면, 기존 script의 이벤트를 모두 제거하고 스크립트도 제거한 후 새로 만들어야 한다 * BREAKING CHANGE: 기존 코드 삭제 * chore(release): publish [skip ci] - @tosspayments/[email protected] - @tosspayments/[email protected] - @tosspayments/[email protected] - @tosspayments/[email protected] - @tosspayments/[email protected] * chore(release): publish [skip ci] - @tosspayments/[email protected] - @tosspayments/[email protected] - @tosspayments/[email protected] - @tosspayments/[email protected] - @tosspayments/[email protected] * yarn * chore: typescript 5.5.2 -> 5.2.2 (오타) * test: 테스트 꺠지는 곳 수정 * feat: script-loader에서 발생하는 예외 에러들 추상화하고 테스트에서 활용 * test: v1 브랜드페이, v1 위젯에도 테스트 추가 * choree: script-loader 분기마다 주석 추가 * chore * chore: 테스트 유틸을 export 하는 걸 제거하고, 관련된 test를 임시로 skip 합니다. (#96) * chore: browser SDK의 패키지들을 지정한 버전으로 배포되도록 합니다 (#97) * chore(release): publish [skip ci] - @tosspayments/[email protected] - @tosspayments/[email protected] - @tosspayments/[email protected] - @tosspayments/[email protected] - @tosspayments/[email protected] * chore: browser-sdk test with alpha 3.0 * chore: 각 패키지 manual version up * chore: 변경사항이 없더라고 지정된 버전으로 강제로 version up 하도록 ci 설정을 변경합니다 * chore: standard-public-interface update * chore: ci에서 버전업 하는 스크립트를 제거하고, package에 명시된 버전으로 publish 하도록 임시로 설정 * chore: 주석 추가 * test: skip 처리한 테스트를 복원합니다 (#98) * test: skip 처리한 테스트를 복원합니다 * test: 테스트 복원 누락 * fix: 중복 코드 제거 * refactor: 테스트 리팩토링 (#99) * refactor: script element mock 유틸 활용 * refactor: SDK load 테스트에서 NamespaceNotAvailableError 에러 관련 검증을 하지 않는다 * chore: end of line * chore: end of line * chore: Public Interface version up (#100) * chore: public interface versino up * chore: export convention * refactor: 테스트 리팩토링 (#102) * refactor: addEventListener를 목킹하는 대신, dispatchEvent 메소드를 사용 * refactor: document.createElement mocking은 유틸 내에서 공통으로 처리한다 * chore: 누락
#98 의 리뷰를 반영합니다