# 2020年10月10日モブプロ#9
[MDの書き方](https://qiita.com/tbpgr/items/989c6badefff69377da7)
モブプロのコンテンツは🤟がついています。
# 本日の目標
クライアントサイドのテスト実装!
# テストライブラリ参考サイト
- https://testing-library.com/docs/react-testing-library/intro
- https://qiita.com/ossan-engineer/items/4757d7457fafd44d2d2f
# Footerのテストを書いてみよう🤟
```javascript=
describe('Footer', () => {
describe('Layout', () => {
it('会社名表示', () => {
const { container } = render(<Footer />)
const footer = container.querySelector('h3')
expect(footer).toHaveTextContent('skywill')
// const test = render(<Footer />)
// console.log(test);
});
});
});
```
## material-UI使ってるとHTMLの表示わからなく難しい?
そんなときは`screen`を導入。
```javascript=2
import { render, screen } from '@testing-library/react'
```
```javascript=
it('会社名表示', () => {
const { container } = render(<Footer />)
screen.debug()
});
```
`screen.debug()`を行うと以下が表示
```javascript=
<body>
<div>
<footer
class="makeStyles-footer-1"
>
<div
class="MuiToolbar-root MuiToolbar-regular makeStyles-footerContainer-2 MuiToolbar-gutters"
>
<h3
class="MuiTypography-root MuiTypography-body1"
varient="h3"
>
Skywill
</h3>
</div>
</footer>
</div>
</body>
```
これで確認しながらテストを書いていく。
# Headerのテストを書いてみよう🤟
```javascript=
describe('Header', () => {
describe('Layout', () => {
it('タイトル表示', () => {
const { container } = render(<Header />)
const header = container.querySelector('h4')
expect(header).toHaveTextContent('Todoアプリ')
});
});
});
```
# Appのテストを書いてみよう🤟
## render時にaxiosを呼ぶ
```javascript=3
import App from './App'
import axios from 'axios'
const mockEmptyGetTask = {
data: []
}
describe('App', () => {
describe('Lifecycle', () => {
it('レンダー時にaxiosを呼ぶ url確認', () => {
axios.get = jest.fn().mockResolvedValue(mockEmptyGetTask)
render(<App />)
expect(axios.get).toHaveBeenCalledWith('http://localhost:8000/tasks')
});
it('レンダー時にaxiosを呼ぶ 呼び出したか確認', () => {
axios.get = jest.fn().mockResolvedValue(mockEmptyGetTask)
render(<App />)
expect(axios.get).toHaveBeenCalledTimes(1)
});
});
});
```
## レイアウトのテスト
```javascript=23
decribe('Layout', () => {
describe('マウント with no data', () => {
it('テキストフィールドがあるかどうか', () => {
const { queryByTestId } = render(<App />)
const titleTextField = queryByTestId('title-text')
expect(titleTextField).tobeInTheDocument()
})
})
})
```
だが、このままでは`null`なので`App.js`を編集する。
### App.jsの編集
テキストフィールドに`testId`を付与する必要がある。
```jsx=
<TextField
label="タイトル"
value={taskTitle}
onChange={handleTextFieldChanges}
inputProps={{"data-testid":"title-text"}} // これを追加
/>
```
これでテストを通過することができるようになる。
## 作成ボタンのテスト
```javascript=30
it('作成ボタンがあるかどうか', () =>{
const {queryByTestId} = render(<App />)
const createButton = queryByTestId('create-buttun')
expect(createButton).toBeInTheDocument()
})
```
### App.jsの編集
```jsx=
<Button
variant="contained"
color="primary"
disabled={taskTitle===''}
onClick={addTask}
data-testid="create-button" // これを追加
>
作成
</Button>
```
## 完了ボタンのテスト
```javascript=35
it('完了ボタンがあるかどうか', () =>{
const {queryByTestId} = render(<App />)
const completeButton = queryByTestId('complete-button')
expect(completeButton).toBeInTheDocument()
})
```
### App.jsの編集
```jsx=
<Button
variant="contained"
color="primary"
disabled={!tasks.some(x=>x.doing)}
onClick={() => doneTask()}
data-testid="complete-button" // これを追加
>
完了
</Button>
```
## チェックボックスのテスト
```javascript=40
it('チェックボックスがないこと', () =>{
const {queryByTestId} = render(<App />)
const doingCheckBox = queryByTestId('doing-check')
expect(doingCheckBox).not.toBeInTheDocument()
})
```
### App.jsの編集
```jsx=
<Checkbox
disabled={task.done}
checked={task.doing}
value="primary"
onChange={() => handleCheckboxChanges(task)}
inputProps={{"data-testid":"doing-check"}}
/>
```
## リストの存在テスト
```javascript=45
it('リストがないこと', () =>{
const {queryByTestId} = render(<App />)
const listText = queryByTestId('list-text')
expect(listText).not.toBeInTheDocument()
})
```
## 削除ボタンの存在テスト
```javascript=50
it('削除ボタンがないこと', () =>{
const {queryByTestId} = render(<App />)
const deleteButton = queryByTestId('delete-button')
expect(deleteButton).not.toBeInTheDocument()
})
```
## 初期状態でボタンが押せないようになっているかテスト
```javascript=
it('作成ボタンが押せないこと', () =>{
const {queryByTestId} = render(<App />)
const createButton = queryByTestId('create-button')
expect(createButton.disabled).toBeTruthy()
})
it('完了ボタンが押せないこと', () =>{
const {queryByTestId} = render(<App />)
const completeButton = queryByTestId('complete-button')
expect(completeButton.disabled).toBeTruthy()
})
```
## データ取得時に各種ボタンがあるかどうかのテスト
```javascript=
describe('マウント with data', () => {
beforeEach(() => {
axios.get = jest.fn().mockResolvedValue(mockSuccessGetTask)
})
it('チェックボックスがあること', () =>{
const {queryByTestId} = render(<App />)
const doingCheckBox = queryByTestId('doing-check')
screen.debug()
expect(doingCheckBox).not.toBeInTheDocument()
})
it('リストがあること', () =>{
const {queryByTestId} = render(<App />)
const listText = queryByTestId('list-text')
expect(listText).not.toBeInTheDocument()
})
it('削除ボタンがあること', () =>{
const {queryByTestId} = render(<App />)
const deleteButton = queryByTestId('delete-button')
expect(deleteButton).not.toBeInTheDocument()
})
})
```
上記でエラーになるはずが...なぜか成功してしまう...
次週に持ち越し!