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

[doc] Tutorial - Todo App: 할 일 추가하기 #76

Merged
merged 25 commits into from
Sep 6, 2021

Conversation

dngwoodo
Copy link
Collaborator

@dngwoodo dngwoodo commented Aug 23, 2021

관련 이슈

#33

요약

할 일 추가하기 기능 구현과 테스트 코드 작성 파트 입니다.
다음 파트는 테스트 코드 리팩토링입니다. 감안하고 봐주시면 감사하겠습니다.

@dngwoodo dngwoodo changed the title Todo app example [doc] Tutorial - Todo App: 할 일 추가하기 Aug 23, 2021
@dngwoodo dngwoodo requested a review from yahma25 August 23, 2021 17:08
@dngwoodo dngwoodo added the doc 문서 또는 가이드 관련 PR label Aug 24, 2021
Copy link
Collaborator Author

@dngwoodo dngwoodo left a comment

Choose a reason for hiding this comment

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

셀프 리뷰 및 피드백이 필요한 부분들을 적어봤습니다 :)

Comment on lines 249 to 277
// setValue는 아래 두 코드의 축약 api 입니다.
wrapper.find("input").setValue("아무것도 안하기");
// wrapper.find("input").element.value = "아무것도 안하기";
// wrapper.find("input").trigger("input");
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이 부분은 조금 헷갈리는 데 이벤트 트리거는 공식문서에서 비동기로 취급하는 것 같습니다. 근데 테스트 해보니 input 이벤트 트리거는 동기적으로 동작하는 것 같습니다.

https://vue-test-utils.vuejs.org/api/wrapper/setvalue.html

Copy link
Collaborator

@amorfati0310 amorfati0310 Aug 29, 2021

Choose a reason for hiding this comment

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

문서랑 직접 비교하기 어려운게 mount, shallowMount 그리고 문서에서는 await 한 후 input element에 value랑 비교하고 있어서 api 비교를 다시 한 번 해보셔야 할 것 같아요. 문서처럼 이벤트 후에 dom 변화를 다시 테스트 코드로 살펴보려면 await가 필요해보이네요

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다:) 한번 더 확인해보고 변경하도록 하겠습니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

cf4eab5 에서 변경했습니다 :)


이런 식으로 학습하시면서 아쉬운 부분들이 생긴다면 테스트를 추가해보세요.

그리고 위의 테스트 코드에서 `describe`, `it`의 첫 번째 인수를 합쳐보면 `App renders label, input`, `App renders button`으로 문장이 만들어지는 것을 보실 수 있습니다. `render`는 `App`이 단수이기 때문에 뒤에 s를 붙여서 `renders`로 작성하는 겁니다. 이런 식으로 문법에 맞게 작성해주세요. 그리고 테스트 코드를 작성하실 때는 항상 `말이 되게` 작성하시는 것을 권장해 드립니다. 나중에 해당 컴포넌트의 역할을 파악하고 싶을 때 [관심사의 분리(separation of concerns, SoC)](https://ko.wikipedia.org/wiki/%EA%B4%80%EC%8B%AC%EC%82%AC_%EB%B6%84%EB%A6%AC)를 잘해놓았다면 테스트 코드만으로도 파악이 가능합니다. 이 부분은 튜토리얼 마지막 부분에서 다뤄보겠습니다.
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이 부분 밑에 테스트 코드 실행 시 터미널 창에 출력되는 문장들의 이미지를 넣어줘도 좋을 것 같습니다.

Copy link
Collaborator

Choose a reason for hiding this comment

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

셀프리뷰 좋은 습관이네요 ~~

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

bba60df 에서 추가했습니다.

Comment on lines 103 to 125
## 프로젝트 시작

프로젝트 준비가 끝났으니 Todo App을 구현해보겠습니다. 저희가 구현해야 되는 기능들을 다음과 같으며 차례대로 구현합니다.
- 할 일 추가하기
- 할 일 체크하기
- 할 일 삭제하기

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

package.json에 "test:unit": "vue-cli-service test:unit""test:unit": "vue-cli-service test:unit --watchAll"로 변경하는 내용이 있으면 좋을 것 같습니다. 테스트를 작성하고 수정할 때 마다 실행시키면 불편할 것 같네요.

Copy link
Collaborator

Choose a reason for hiding this comment

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

tip으로 알려줘도 좋은 것 같네요 😃

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다. bb0053d 에서 추가했습니다.

```
```js
// src/App.test.js
import { shallowMount } from "@vue/test-utils";
Copy link
Collaborator Author

@dngwoodo dngwoodo Aug 24, 2021

Choose a reason for hiding this comment

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

굳이 shallowMount를 써야 되나 고민입니다. 저는 테스트를

  1. 해당 컴포넌트에서 사용자에게 보여지는 것
  2. 테스트 코드만 보더라도 해당 컴포넌트를 이해할 수 있어야 함

위의 2가지에 중점을 두고 작성하고 있습니다.

하지만 shallowMount를 쓰면 child component를 랜더링을 하지 않기 때문에 동작이 달라질 수 있고 공통적으로 사용되는 컴포넌트는 따로 컴포넌트로 만들어서 사용하는 경우가 많기 때문에 테스트 코드만 보더라도 해당 컴포넌트를 온전히 다 이해할 순 없을 것 같습니다.

멘토님들 생각은 어떠신가요 ?

Copy link
Collaborator

Choose a reason for hiding this comment

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

child component가 따로 없는 지금 같은 상황에서는 비용적인 측면에서 유리한 면이 있기 때문에 shallowMount 잘 쓰신 것 같네요
고민하신 것 처럼 여러 컴포넌트의 동작에 확인이 필요할 때는 mount를 주로 쓸 것 같네요

Copy link
Collaborator

@yahma25 yahma25 left a comment

Choose a reason for hiding this comment

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

진행이 빠르시네요~ 🚀 피드백 남겼습니다~
vue는 아직 학습중이라 코드 내용면에선 아직 할 말이 많지않네요 😅

Comment on lines 103 to 125
## 프로젝트 시작

프로젝트 준비가 끝났으니 Todo App을 구현해보겠습니다. 저희가 구현해야 되는 기능들을 다음과 같으며 차례대로 구현합니다.
- 할 일 추가하기
- 할 일 체크하기
- 할 일 삭제하기

Copy link
Collaborator

Choose a reason for hiding this comment

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

tip으로 알려줘도 좋은 것 같네요 😃


## 프로젝트 시작

프로젝트 준비가 끝났으니 Todo App을 구현해보겠습니다. 저희가 구현해야 되는 기능들을 다음과 같으며 차례대로 구현합니다.
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
프로젝트 준비가 끝났으니 Todo App을 구현해보겠습니다. 저희가 구현해야 되는 기능들을 다음과 같으며 차례대로 구현합니다.
프로젝트 준비가 끝났으니 Todo App을 구현해보겠습니다. 우리가 테스트 코드와 함께 구현할 기능은 다음과 같습니다.

[제안] 아래 수정사항을 기준으로 조금 다르게 표현해봤습니다~ 😏
저희 -> 우리, 기능들을 -> 기능은

Copy link
Collaborator Author

@dngwoodo dngwoodo Aug 26, 2021

Choose a reason for hiding this comment

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

피드백 감사합니다. 4bf6625 에서 수정했습니다. 두번째는 기능들을 -> 기능들은 으로 변경했습니다.


## 할 일 추가하기

[완성 코드]()
Copy link
Collaborator

Choose a reason for hiding this comment

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

링크가 비어 있는데 나중에 추가되는 걸까요? 🙄

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

넵 마지막에 추가할 생각입니다 :)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

f671d43 에서 추가했습니다.


UI 구현 코드에서 작성해야 되는 테스트 코드는 다음과 같습니다.
- `할 일 작성`이라는 텍스트가 화면에 출력됩니다.
- 할 일을 작성할 수 있는 `control`이 화면에 출력됩니다.
Copy link
Collaborator

Choose a reason for hiding this comment

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

처음에 control을 보고 어떤 걸 말하는지 몰라서 멈칫해서 코드를 봤는데 input을 의미하는 거였군요. 😅

input or 할 일 입력란과 같이 좀 더 명확히 알려주면 어떨까요? 😃

변경한다면 일괄 수정이 필요하겠군요.

Copy link
Collaborator Author

@dngwoodo dngwoodo Aug 26, 2021

Choose a reason for hiding this comment

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

피드백 감사합니다.
항상 input과 관련된 것들은 control로 표현해왔는데 많이 어색한가요 ?
우선 109c2c0 에서 control 창이라고 변경을 했습니다.

Copy link
Collaborator

@yahma25 yahma25 Aug 26, 2021

Choose a reason for hiding this comment

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

저는 흥미롭게 느꼈는데 다른 분들의 의견도 궁금하네요.
저 같은 경우, 실무에선 개발자-디자이너 간에 사람마다 조금 차이가 있지만 인풋/입력란/텍스트 입력란/텍스트 박스 이런 식으로 말해왔고 들어왔어요.
의 경우 팝업류 UI 에서 사용했었어요. 영문명인 window로 사용하는 것으로 알고 있었어요~ 😃

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

5f423c8 에서 control창input창으로 변경해주었습니다 :)

});
```

`click`이벤트 트리거는 비동기로 동작하기 때문에 `async, await`문법을 사용하여 동기적으로로 동작하게 만듭니다. `control` 창에 할 일을 타이핑하고 `추가하기 button`이 클릭 됐을 때 타이핑한 할 일이 화면에 출력 되는지 테스트합니다.
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
`click`이벤트 트리거는 비동기로 동작하기 때문에 `async, await`문법을 사용하여 동기적으로로 동작하게 만듭니다. `control` 창에 할 일을 타이핑하고 `추가하기 button` 클릭 됐을 때 타이핑한 할 일이 화면에 출력 되는지 테스트합니다.
`click`이벤트 트리거는 비동기로 동작하기 때문에 `async, await`문법을 사용하여 동기적으로로 동작하게 만듭니다. `control` 창에 할 일을 타이핑하고 `추가하기` 버튼이 클릭 됐을 때 타이핑한 할 일이 화면에 출력 되는지 테스트합니다.

[제안]
글 윗 부분에서 추가하기 버튼 식으로 표현을 해와서 동일하게 맞춰주면 좋을 것 같아요 😄

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다. f43218d 에서 변경했습니다 :)

@dngwoodo dngwoodo force-pushed the todo-app-example branch 2 times, most recently from f43218d to b8e6dbe Compare August 28, 2021 14:57
Copy link
Collaborator

@amorfati0310 amorfati0310 left a comment

Choose a reason for hiding this comment

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

안녕하세요 동우님 수고많으셨습니다. 점차 주가되는 todo예제들이 기대가 되네요

import App from "./App.vue";

describe("App", () => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
describe("App", () => {
describe("Todo App render test", () => {

describe을 조금 더 설명 적어주어도 좋을 것 같네요.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다 :) 저는 테스트 코드를 작성할 때 describe - context -it 구조로 작성을 하고 있는데요. 예를 들어 밑에처럼

describe('App', () => {
   context('when logged in', () => {
     it('renders profile', () => {})
  })
})

App when logged in renders profile 이런식으로 문장이 이어지게 작성하고 있습니다. 이렇게 작성하는 것에 대해서는 어떻게 생각하실까요 ?

Copy link
Collaborator

Choose a reason for hiding this comment

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

얘기하신 describe - context -it 룰에 맞춰서 작성하시는 것도 좋아 보입니다 👍

Copy link
Collaborator

Choose a reason for hiding this comment

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

저도 다른 분들은 어떻게 하고 계신지 궁금하네요. 🙄
회사에서는, 한글로 작성하고 있는데 describe에는 제목을, 테스트 로직이 있는 it 대신 test에는 검증할 내용을 작성하고 있어요.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

한글을 쓴다면 저도 describe에 테스트하는 컴포넌트 이름을 적고 it보단 test를 사용해서 검증할 내용을 작성할 것 같습니다. 명호님이 사용하고 계시는 테스트 코드의 예시를 하나 들어주실 수 있을까요 ? 😊

Copy link
Collaborator

Choose a reason for hiding this comment

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

describe('요소 기능 제한 테스트', () => {
  // ...
  describe('체크 기능 테스트', () => {
    test('허용 리스트에 존재하면 제한된 것으로 간주한다', () => {
      // ...
    });
    test('리스트에 존재하지 않으면 제한되지 않은 것으로 간주한다', () => {
      // ...
    });
  });
});

Webstorm 기준 IDE에서 결과를 볼 때 아래와 같이 나와요.

▼ √ Test Results
  ▼ √ xxx_test.ts
    ▼ √ 요소 기능 제한 테스트
      ▼ √ 체크 기능 테스트
            √ 허용 리스트에 존재하면 제한된 것으로 간주한다
            √ 리스트에 존재하지 않으면 제한되지 않은 것으로 간주한다

컨벤션에 따른 차이일 것 같아요. 😄 (저흰 테스트 코드에 대한 컨벤션은 없고 1세대 개발자들을 따라서 작성을...ㅋ)

Vue.js github에서는 테스트 영역마다 다르기도 하네요. 🤔
ex 1) ssr-string.spec.js
ex 2) show.spec.js

개인적으론 동우님이 작성하시는 스타일로 해보는 것도 좋을 것 같아요 👍

Copy link
Collaborator Author

@dngwoodo dngwoodo Aug 30, 2021

Choose a reason for hiding this comment

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

테스트 코드 작성에 정답은 없는 것 같습니다 ㅎㅎ 개인적인 생각으론 다른 사용자들이 보기에 해당 테스트의 의도가 가독성 있게 잘 읽힌다면 상관 없을 것 같습니다. 혹시나 jest에서 context를 사용하시게 된다면 jest-plugin-context 라이브러리를 사용해보시면 좋을 것 같습니다. context에는 when, with를 사용해서 작성하며 테스트 검증문의 길이를 줄여주고 가독성을 높여줍니다.

https://www.betterspecs.org/#contexts

Copy link
Collaborator

Choose a reason for hiding this comment

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

처음 알게되네요. 공유 고마워요! 🚀

Copy link
Owner

Choose a reason for hiding this comment

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

저도 여기에 제 의견을 좀 공유해 드리고 싶은데요..! 이미 다들 잘 애기 나눠 주셔서 넘 늦게 온거 같기도 한데.. ㅎㅎ

  1. 일단 저도 동우님처럼 describe, it 단위로 작성하는게 편한 것 같습니다. 테스트 파일을 쪼개기 나름인 것 같아요.
  2. 그리고 보다 보니까 저는 보통 expect 안에 여러 개의 API를 연결해서 바로 넣는 것보다는 아래와 같은 형태로 작성하는데요. 이게 좀 더 어떤 걸 테스트 하는 건지 눈에 잘 들어오는 것 같아요. 뭐 이런건 취향 차이일수 있으니까 ㅋㅋ
it("renders title", () => {
    const wrapper = shallowMount(App);
    const headingText = wrapper.find("h1").text();
    expect(headingText).toMatch("Todo App");
  });


이런 식으로 학습하시면서 아쉬운 부분들이 생긴다면 테스트를 추가해보세요.

그리고 위의 테스트 코드에서 `describe`, `it`의 첫 번째 인수를 합쳐보면 `App renders label, input`, `App renders button`으로 문장이 만들어지는 것을 보실 수 있습니다. `render`는 `App`이 단수이기 때문에 뒤에 s를 붙여서 `renders`로 작성하는 겁니다. 이런 식으로 문법에 맞게 작성해주세요. 그리고 테스트 코드를 작성하실 때는 항상 `말이 되게` 작성하시는 것을 권장해 드립니다. 나중에 해당 컴포넌트의 역할을 파악하고 싶을 때 [관심사의 분리(separation of concerns, SoC)](https://ko.wikipedia.org/wiki/%EA%B4%80%EC%8B%AC%EC%82%AC_%EB%B6%84%EB%A6%AC)를 잘해놓았다면 테스트 코드만으로도 파악이 가능합니다. 이 부분은 튜토리얼 마지막 부분에서 다뤄보겠습니다.
Copy link
Collaborator

Choose a reason for hiding this comment

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

셀프리뷰 좋은 습관이네요 ~~

<br />

1. 기능 구현 - `control`창에 할 일 작성 시 data에 할 일 텍스트 값 넣기
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
1. 기능 구현 - `control`창에 할 일 작성 시 data에 할 일 텍스트 값 넣기
1. 기능 구현 - (input 창 or 할 일 입력 창에) 할 일 작성 시 data에 할 일 텍스트 값 넣기

control 창보다 쉽게 파악할 것 같은데 어떻게 생각하시나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다 :) 말씀하신대로 수정해보겠습니다!

Copy link
Collaborator Author

@dngwoodo dngwoodo Aug 30, 2021

Choose a reason for hiding this comment

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

5f423c8 에서 control창을 input창으로 변경해주었습니다 :)

```js
// src/App.test.js
it("listens input event", () => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

조금 더 명시적으로 description 작성해주셔도 좋을 것 같네요
할 일 입력값을 입력할 때 입력값이 연결된 vue data 에 저장된다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다:) 이 테스트 코드 의도 자체가 input event 발생에 대한 테스트입니다.

it('listens input event when change input value', () => {})

이런식으로 적어주는 것에 대해서 멘토님은 어떻게 생각하시나요 ?

Copy link
Collaborator

Choose a reason for hiding this comment

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

테스트코드에 의도 자체가 이벤트 리슨이면 의도하신대로 적는게 맞는 것 같아요.
input events listen을 test하는거면 함수 콜만 비교해도 될 것 같네요 ,
뒤에 비교하는 부분 vm.text랑 값을 비교하는 부분이 있어서 그 부분이랑 매칭이 되면 더 좋을 것 같아요

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Comment on lines 249 to 277
// setValue는 아래 두 코드의 축약 api 입니다.
wrapper.find("input").setValue("아무것도 안하기");
// wrapper.find("input").element.value = "아무것도 안하기";
// wrapper.find("input").trigger("input");
Copy link
Collaborator

@amorfati0310 amorfati0310 Aug 29, 2021

Choose a reason for hiding this comment

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

문서랑 직접 비교하기 어려운게 mount, shallowMount 그리고 문서에서는 await 한 후 input element에 value랑 비교하고 있어서 api 비교를 다시 한 번 해보셔야 할 것 같아요. 문서처럼 이벤트 후에 dom 변화를 다시 테스트 코드로 살펴보려면 await가 필요해보이네요

/>
<!-- @click="handleClick" 추가 -->
<button type="button" @click="handleClick">추가하기</button>
Copy link
Collaborator

@amorfati0310 amorfati0310 Aug 29, 2021

Choose a reason for hiding this comment

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

테스트 내용이랑은 크게 상관없지만 코딩 스타일 + ui 적으로 피드백 드려요

  • handleClick -> addTodo ui 이벤트에 맞춘 이름 보다 어떤 행위인지 명시적인 메소드 명이면 더 좋을 것 같습니다
  • form으로 쓰기 때문에 버튼 type=submit으로 받아서 enter 이벤트도 쉽게 받을 수 있도록 처리해서 form에서 submit이벤트로 받아서 할 일 을 추가해주면 더 좋을 것 같네요

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다 :) 말씀해주신대로 변경해보겠습니다!

Copy link
Collaborator Author

@dngwoodo dngwoodo Aug 30, 2021

Choose a reason for hiding this comment

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

  • fd965a2 에서 handeClick을 좀 더 명시적으로 handeClickAddTodo로 변경해주었습니다.

  • 한번 더 생각해보니 form 태그를 굳이 써야 되나 라는 생각을 가지게 되어 54b8735 에서 form -> div로 변경해주는 작업을 했습니다.

const wrapper = shallowMount(App);

wrapper.find("input").setValue("아무것도 안하기");
Copy link
Collaborator

Choose a reason for hiding this comment

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

line을
given
when
then
에 맞춰서
setValue랑 awiat단락은 묶어주면 더 좋을 것 같습니다

Copy link
Collaborator

Choose a reason for hiding this comment

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

given/when/then 좋습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다 :) 패턴에 맞춰서 변경해보겠습니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

5c4ab79 에서 변경했습니다 :)

```js
// src/App.test.js
it("listens click event", async () => {
Copy link
Collaborator

@amorfati0310 amorfati0310 Aug 29, 2021

Choose a reason for hiding this comment

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

여기도 클릭이벤트 테스트 라는 description 보다는
할일 추가 테스트 혹은 할 일 작성 후 투두 리스트에 제대로 값이 있는지 테스트 등 조금 더 명시적으로 적어주시면 좋을 것 같습니다

Copy link
Collaborator Author

@dngwoodo dngwoodo Aug 30, 2021

Choose a reason for hiding this comment

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

피드백 감사합니다 :) 이 부분도 #76 (comment) 마찬가지로 테스트 의도가 click event가 발생되는 것에 두고 있어서

it("listens click event when click '추가하기' button", () => {})

로 작성하는 해보려고 합니다. 멘토님 의견은 어떠실까요 ?

Copy link
Collaborator

Choose a reason for hiding this comment

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

어 이 부분도 테스트 스펙이랑 확인하는 과정을 보면 할 일을 추가 버튼을 누르고 할일이 추가된 것을 확인하는 테스트 같은데 어떻게 생각하시나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

말씀하신대로 해당 테스트 내용이 이벤트 테스트라기보단 할일이 추가된 것을 확인하는 테스트 처럼 보입니다. 위에서 말씀해주신 것처럼 함수 콜에 대한 부분을 작성해보겠습니다 !

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

생각해보니 클릭 이벤트를 테스트 하는 것 보단 기능 구현과 일치시키는 게 맞다고 생각 됩니다.
2988160 에서 테스트 검증문을 수정했습니다 :)

Copy link
Owner

@joshua1988 joshua1988 left a comment

Choose a reason for hiding this comment

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

@dngwoodo 에고 동우님 제가 너무 늦게 피드백을 드렸죠.. 벌써 튜토리얼 진도가 많이 나갔네요. 상세하고 친절하게 잘 작성된 것 같습니다 😄 몇 가지 피드백 남겼는데 보시고 의견 있으시면 남겨주세요! :)

## 할 일 추가하기

[완성 코드](https://github.com/dngwoodo/vue-todo-app-test/tree/ec674be494e8c27f6440e689ab40714ec255c19e)
Copy link
Owner

Choose a reason for hiding this comment

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

@dngwoodo 동우님 요 부분은 지난번 PR에서 말씀 드렸어야 했는데 요건 단어 하나만 툭 튀어나오는 것 보다 좀 더 설명이 들어가면 좋을 것 같아요 😄

할 일 추가하기의 구현 순서는 다음과 같으며 최종 코드는 여기서 확인하실 수 있습니다.

대략 이런 식으로..? 😄

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다 :) baf2578 에서 변경했습니다.

UI 구현 코드에서 작성해야 되는 테스트 코드는 다음과 같습니다.
- `할 일 작성`이라는 텍스트가 화면에 출력됩니다.
- 할 일을 작성할 수 있는 `input 창`이 화면에 출력됩니다.
Copy link
Owner

Choose a reason for hiding this comment

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

Suggested change
- 할 일을 작성할 수 있는 `input 창` 화면에 출력됩니다.
- 할 일을 작성할 수 있는 인풋 태그가 화면에 출력됩니다.

Copy link
Collaborator Author

@dngwoodo dngwoodo Sep 2, 2021

Choose a reason for hiding this comment

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

피드백 감사합니다:) 10bfb48 에서 수정했습니다. 커밋을 나눌 필요가 있어보이는데 실수로 두가지 수정을 한 커밋에 넣어버렸네요..🥲


UI 구현 코드에서 작성해야 되는 테스트 코드는 다음과 같습니다.
- `할 일 작성`이라는 텍스트가 화면에 출력됩니다.
Copy link
Owner

Choose a reason for hiding this comment

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

Suggested change
- `할 일 작성`이라는 텍스트가 화면에 출력됩니다.
- "할 일 작성"이라는 텍스트가 화면에 출력됩니다.

그 저희가 백틱은 인라인 코드에만 적용하는게 좋을 것 같아서 별도의 강조 표시가 필요하시다면 큰 따옴표나 * 쓰면 좋을 것 같습니다 😄

Copy link
Collaborator

Choose a reason for hiding this comment

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

@dngwoodo 님 안녕하세요 이쪽 백틱쪽만 한 번 ""로 고치는게 좋은 부분 있는지 보면 좋을 것 같네요

- `추가하기`라는 버튼이 화면에 출력됩니다.

한가지 알아두셔야 할 것은 테스트 코드는 작성하는 사람에 따라 얼마든지 달라질 수 있습니다. 테스트 코드를 얼마나 세세하게 작성하냐에 따라서 코드의 안전성이 달라집니다. 즉, 테스트 코드를 작성한다고 해서 모든 에러를 방지할 수 있는 게 아닙니다. 그러므로 학습하실 때는 조금이라도 더 세세하게 테스트를 작성해보시는 걸 권장해 드립니다.
Copy link
Owner

Choose a reason for hiding this comment

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

문서 전반적으로 맞춤법 검사를 한번 하면 좋을 것 같아요! 😄

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다:) 10bfb48 에서 수정했습니다.

한가지 -> 한 가지 로 수정

import App from "./App.vue";

describe("App", () => {
Copy link
Owner

Choose a reason for hiding this comment

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

저도 여기에 제 의견을 좀 공유해 드리고 싶은데요..! 이미 다들 잘 애기 나눠 주셔서 넘 늦게 온거 같기도 한데.. ㅎㅎ

  1. 일단 저도 동우님처럼 describe, it 단위로 작성하는게 편한 것 같습니다. 테스트 파일을 쪼개기 나름인 것 같아요.
  2. 그리고 보다 보니까 저는 보통 expect 안에 여러 개의 API를 연결해서 바로 넣는 것보다는 아래와 같은 형태로 작성하는데요. 이게 좀 더 어떤 걸 테스트 하는 건지 눈에 잘 들어오는 것 같아요. 뭐 이런건 취향 차이일수 있으니까 ㅋㅋ
it("renders title", () => {
    const wrapper = shallowMount(App);
    const headingText = wrapper.find("h1").text();
    expect(headingText).toMatch("Todo App");
  });

<br />

1. 기능 구현 - `input 창`에 할 일 작성 시 data에 할 일 텍스트 값 넣기
Copy link
Owner

Choose a reason for hiding this comment

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

@dngwoodo 요거 인풋 창도 정리해주세요 😄

Copy link
Owner

Choose a reason for hiding this comment

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

Suggested change
1. 기능 구현 - `input 창`에 할 일 작성 시 data에 할 일 텍스트 값 넣기
3. 기능 구현 - `input 창`에 할 일 작성 시 data에 할 일 텍스트 값 넣기

요게 3번 맞죠?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

실수했네요 ㅎㅎ.. 피드백 감사합니다 :) 9ddb2c3 에서 수정했습니다.

```

v-model을 사용하지 않은 이유는 현재 시점에서는 IME 입력(한국어, 일본어, 중국어)에 대해서 한계점이 있기 때문입니다. 자세한 내용은 이 [링크](https://joshua1988.github.io/web-development/vuejs/v-model-usage/#%EA%B7%B8%EB%9F%BC-v-model%EC%9D%B4-%EB%8D%94-%ED%8E%B8%ED%95%98%EB%8B%88%EA%B9%8C-%EC%9D%B4%EA%B1%B0-%EC%93%B0%EB%A9%B4-%EB%90%98%EB%8A%94%EA%B1%B0%EC%A3%A0)를 참고해주세요.
Copy link
Owner

Choose a reason for hiding this comment

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

@dngwoodo 그쵸 테스트 코드 볼 정도면 이제 실무하시는 분들이니까 v-model이 아니라 :value @input 조합 넘 좋습니다 😄

```

vue-test-utils 라이브러리에선 `input`이벤트를 `trigger`시 `event.target.value`를 직접적으로 변경할 수 없습니다. 그래서 `input`의 `value`값을 변경한 뒤 `input`이벤트를 `trigger`해야 합니다. `input`이벤트를 `trigger`하면 `handleInput`함수가 실행되고 `data`의 `text`값이 변경됐는지 테스트합니다. 그리고 이벤트 트리거는 비동기로 동작하기 때문에 `async, await`문법을 사용하여 동기적으로로 동작하게 만듭니다.
Copy link
Owner

Choose a reason for hiding this comment

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

Suggested change
vue-test-utils 라이브러리에선 `input`이벤트를 `trigger``event.target.value`를 직접적으로 변경할 수 없습니다. 그래서 `input``value`값을 변경한 뒤 `input`이벤트를 `trigger`해야 합니다. `input`이벤트를 `trigger`하면 `handleInput`함수가 실행되고 `data``text`값이 변경됐는지 테스트합니다. 그리고 이벤트 트리거는 비동기로 동작하기 때문에 `async, await`문법을 사용하여 동기적으로로 동작하게 만듭니다.
vue-test-utils 라이브러리에선 `input`이벤트를 `trigger``event.target.value`를 직접적으로 변경할 수 없습니다. 그래서 `input``value`값을 변경한 뒤 `input`이벤트를 `trigger`해야 합니다. `input`이벤트를 `trigger`하면 `handleInput`함수가 실행되고 `data``text`값이 변경됐는지 테스트합니다. 그리고 이벤트 트리거는 비동기로 동작하기 때문에 `async, await`문법을 사용하여 실행 순서를 보장해 주어야 합니다.

요렇게 풀어서 써보는 건 어떨까요? 😄

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다 :) 비동기라는 단어의 반댓말만 생각하고 풀어서 설명할 생각은 안해봤었네요 🥲 fc6f1fa 에서 수정했습니다.

@input="handleInput"
/>
<!-- @click="handleClickAddTodo" 추가 -->
Copy link
Owner

Choose a reason for hiding this comment

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

@dngwoodo 뷰 프레스에서 추가된 영역을 강조하는 문법이 있는데요. 이거 다른 문서들 참고하셔서 주석들 제거하고 추가된 곳들을 강조해 보면 어떨까요? 😄

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다 :) a6ad272 에서 수정했습니다.

```

`input 창`에 할 일을 타이핑하고 `추가하기` 버튼이 클릭 됐을 때 타이핑한 할 일이 화면에 출력 되는지 테스트합니다.
Copy link
Owner

Choose a reason for hiding this comment

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

@dngwoodo 요것도 정리 부탁드려요 😄

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

피드백 감사합니다:) 10bfb48 여기서 일괄 수정 했습니다.

@yooseongsil yooseongsil linked an issue Sep 5, 2021 that may be closed by this pull request
5 tasks
Copy link
Collaborator

@amorfati0310 amorfati0310 left a comment

Choose a reason for hiding this comment

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

안녕하세요 동우님 한 번 더 살펴보시고 merge 하셔도 좋을 것 같아요 👍


UI 구현 코드에서 작성해야 되는 테스트 코드는 다음과 같습니다.
- `할 일 작성`이라는 텍스트가 화면에 출력됩니다.
Copy link
Collaborator

Choose a reason for hiding this comment

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

@dngwoodo 님 안녕하세요 이쪽 백틱쪽만 한 번 ""로 고치는게 좋은 부분 있는지 보면 좋을 것 같네요

@dngwoodo
Copy link
Collaborator Author

dngwoodo commented Sep 5, 2021

안녕하세요 동우님 한 번 더 살펴보시고 merge 하셔도 좋을 것 같아요 👍

놓쳤었네요 ㅎㅎ 4303d6e 에서 수정했습니다.

기능 구현 - control에 할 일 작성 시 data에 할 일 텍스트 값 넣기
기능 구현 - '추가하기' 버튼을 누르면 할 일 추가
click 이벤트를 -> click 이벤트 로 문장 수정, 이런 식으로 문법에 맞게 작성해주세요. 문장 추가
필자와 독자가 같은 소속이므로 '저희' 보다는 '우리'라는 단어가 더 알맞음.
을 -> 은 으로 오타 수정.
control이 어떤 것인지 좀 더 명시적으로 파악할 수 있게 변경
다른 문장들과 일관성있게 맞추기 위해 변경
해당 마크업에 굳이 form을 사용할 필요 없으므로 div로 변경
given-when-then 패턴으로 테스트 코드 작성 시 사용자들이 좀 더 쉽게 코드를 파악할 수 있기 때문에 변경
해당 테스트의 의도와 테스트 코드를 일치시키기 위해서 변경
실제로 어떤식으로 출력되는 지 보여주기 위해 예제 추가
동기적으로 동작하게 만든다 보다는 실행 순서를 보장해주어야 한다 가 좀 더 쉽게 이해 가능
주석으로 변경된 부분을 표시해주는 것보다 하이라이팅 처리가 가독성이 더 좋기 때문에 변경
인라인 코드에만 백틱을 사용하고 다른 곳에선 쌍따옴표로 변경
@dngwoodo dngwoodo merged commit 40662de into joshua1988:master Sep 6, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
doc 문서 또는 가이드 관련 PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[doc] vue testing
5 participants