Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- hig
- 이벤트버블링
- 직장인인강
- 수강료0원챌린지
- stopPropagation
- 자료구조
- 패스트캠퍼스후기
- 직장인자기계발
- 연결리스트생성
- 패스트캠퍼스
- 연결리스트삭제
- 프로그래머스
- HTML
- 실패율
- MVMM
- JavaScript
- swift
- 오공완
- ios
- 사이드프로젝트10개기술스택으로구현하는풀스택서버리스프로젝트withReact
- 패캠챌린지
- 패캠인강후기
- eventbubbling
- 환급챌린지
- Components
- 코딩테스트
- eventcapturing
- 스위프트
- 이벤트캡처링
- 연결리스트삽입
Archives
- Today
- Total
날쌘 개발자
프로젝트 구현(7) - 멤버 추가 컴포넌트 구현 본문
728x90
패스트캠퍼스 환급챌린지
22일차 화이팅.,,,
멤버 추가 컴포넌트 구현
전의 그룹 생성 컴포넌트를 만들때와 마찬가지로,
먼저 테스트 코드를 만들어준다.
AddMembers.spec.jsx
import { render, screen } from "@testing-library/react"
import userEvent from "@testing-library/user-event"
import { RecoilRoot } from "recoil"
import { AddMembers } from "./AddMembers"
const renderComponent = () => {
render(
<RecoilRoot>
<AddMembers />
</RecoilRoot>
)
const input = screen.getByTestId("input-member-names")
const saveButton = screen.getByText('저장')
return {
input,
saveButton,
}
}
describe('그룹 멤버 추가 페이지', () => {
test('그룹 멤버 입력 컴포넌트가 렌더링 되는가', () => {
const {input, saveButton} = renderComponent()
expect(input).not.toBeNull()
expect(saveButton).not.toBeNull()
})
test('그룹 멤버를 입력하지 않고 "저장" 버튼을 클릭시, 에러 메시지를 노출한다', async () => {
const {saveButton} = renderComponent()
await userEvent.click(saveButton)
const errorMessage = await screen.findByText('그룹 멤버들의 이름을 입력해 주세요.')
expect(errorMessage).toBeInTheDocument()
})
test('그룹 멤버의 이름들을 입력한 후, "저장" 버튼을 클릭시, 저장에 성공', async () => {
const {input, saveButton} = renderComponent()
await userEvent.type(input, '철수 영희 영수')
await userEvent.click(saveButton)
const errorMessage = screen.queryByText('그룹 멤버들의 이름을 입력해 주세요.')
expect(errorMessage).toBeNull()
})
})
그 다음, AddMembers.jsx 를 구현
import { InputTags } from "react-bootstrap-tagsinput"
import { useRecoilState, useRecoilValue } from "recoil"
import { CenteredOverlayForm } from "./CenteredOverlayForm"
import { groupMembersState } from "../state/groupMembers"
import { useState } from "react"
import { groupNameState } from "../state/groupName"
export const AddMembers = () => {
const [groupMembers, setGroupMembers] = useRecoilState(groupMembersState)
const groupName = useRecoilValue(groupNameState)
const [validated, setValidated] = useState(false)
const handleSubmit = (event) => {
event.preventDefault()
setValidated(true)
}
const header = `${groupName} 그룹에 속한 사람들의 이름을 모두 적어 주세요.`
return (
<CenteredOverlayForm
title={header}
validated={validated}
handleSubmit={handleSubmit}
>
<InputTags
data-testid="input-member-names"
placeholder="이름 간 띄어 쓰기"
onTags={(value) => setGroupMembers(value.values)}
/>
{validated && groupMembers.length === 0 && (
<span>그룹 멤버들의 이름을 입력해 주세요.</span>
)}
</CenteredOverlayForm>
)
}
state 관리를 위한 groupMembers.js , groupName.js 도 recoil의 atom을 활용해 만들어 준다.
import { atom } from "recoil"
export const groupMembersState = atom({
key: "groupMembers",
default: [],
})
import { atom } from "recoil"
export const groupNameState = atom({
key: "groupName",
default: undefined,
})
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
728x90
'web > 챌린지' 카테고리의 다른 글
서비스 배포(2) - 기능 테스트 (0) | 2023.03.15 |
---|---|
서비스 배포(1) - 배포 준비, QA테스팅(1) (0) | 2023.03.14 |
프로젝트 구현(6) - 그룹 컴포넌트 구현(3) : Styling (0) | 2023.03.12 |
프로젝트 구현(5) - 그룹 컴포넌트 구현(2) (0) | 2023.03.11 |
프로젝트 구현(4) - 그룹 컴포넌트 구현(1) : 테스트 코드 (0) | 2023.03.10 |