๐คน๐ปโ๏ธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ
> ๊ฐ๋จํ ๋ก๊ทธ์ธ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ ํ๋ฉฐ, ์ ๋ ฅ๊ฐ์ id/pw๋ง ์กด์ฌํ๋ค.
๐ ํ ์คํธ ์ผ์ด์ค
- id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.
- id/pw ์ ๋ ฅ ํ ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๊ฒฝ์ฐ main์ผ๋ก ์ด๋
- ๋ก๊ทธ์ธ์ ์ ๋ณด๊ฐ ๋ง์ง ์๋ ๊ฒฝ์ฐ
- ๋ก๊ทธ์ธ api์์ ์๋ฒ์๋ฌ๊ฐ ๋ฐ์ ํ ๊ฒฝ์ฐ
๐งฉ ์ฌ์ ์์
* LoginPage.vue๋ฅผ ๋ง๋ ๋ค.
* ํ
์คํธ ํ loginpage.test.js๋ฅผ ๋ง๋ ๋ค
<!-- LoginPage.vue -->
<template>
<div>
</div>
</template>
<script>
export default {
setup() {
//
},
};
</script>
<style></style>
๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ด์๋ vue ํ์ผ์ ๋ง๋ ๋ค.
//loginpage.test.js
import LoginPage from '../LoginPage.vue';
import { shallowMount } from '@vue/test-utils';
describe('LoginPage.vue ๋จ์ํ
์คํธ', () => {
let wrapper = null;
beforeEach(() => {
wrapper = shallowMount(LoginPage);
});
test('id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.', () => {});
});
shallowMount๋ฅผ ํตํด์ vueํ์ผ์ ๊ฐ์ ธ์จ๋ค. shallMount๋ jest์์ ๋ ๋๋ง๋ vue์ปดํผ๋ํธ๋ฅผ ์์ฑํ๋ค.
๐ฎ ํ ์คํธ ์ผ์ด์ค 1 : id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.
<!-- LoginPage.vue -->
<template>
<div>
<form>
<label>Id :</label>
<input type="text" id="id" v-model="form.id" /> <br /><br />
<label>Pw :</label>
<input type="password" id="password" v-model="form.password" /> <br /><br />
</form>
</div>
</template>
<script>
import { reactive } from 'vue';
export default {
setup() {
const form = reactive({
id: '',
password: '',
});
return {
form,
};
},
};
</script>
<style></style>
๊ฐ๋จํ id,pw๋ฅผ ์ ๋ ฅ์ ์ํด form์ ๋ง๋ ๋ค.
- reactive๋ฅผ ์ด์ฉํ์ฌ id,password๋ฅผ ๋ง๋ ๋ค.(v-model์ ์ ์ธํ๊ธฐ ์ํด)
//loginpage.test.js
import LoginPage from '../LoginPage.vue';
import { shallowMount } from '@vue/test-utils';
describe('LoginPage.vue ๋จ์ํ
์คํธ', () => {
let wrapper = null;
beforeEach(() => {
wrapper = shallowMount(LoginPage);
});
test('id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.', async () => {
const id = await wrapper.find('#id');
const pw = await wrapper.find('#password');
const idValue = id.element.value;
const pwValue = pw.element.value;
await wrapper.find('form').trigger('submit.prevent');
if (!idValue || !pwValue) {
alert('id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์.');
}
});
});
๊ธฐ์กด loginpage.test.js ์์ ์ถ๊ฐํ ์ฌํญ์ ์๋์ ๊ฐ๋ค
- findํจ์๋ฅผ ํตํด id,pw๋ฅผ ์ฐพ๋๋ค.
- findํจ์๋ฅผ ํตํด id,pw ์ฐพ์๊ฒ์ value๋ฅผ ํตํด idValue,pwValue์ ํ ๋นํ๋ค.
- idValue ๋๋ pwValue์ ๋น๊ฐ์ด ์์ ๊ฒฝ์ฐ alert('id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์.') ๋ฅผ ๋์ด๋ค.

ํ์ง๋ง ์๋ฌ๊ฐ ๋ฌ๋ค. ์๋ ์๋ฌ๋ฅผ ๋ณด๋ฉด Not implemented์ด๋ค. ๋์ถฉ window์ alert๊ฐ ์๋ค๋ ๋ป์ผ๋ก ์ถ์ ๋๋ค.
//loginpage.test.js
import LoginPage from '../LoginPage.vue';
import { shallowMount } from '@vue/test-utils';
/* ์๋กญ๊ฒ ์ถ๊ฐ๋ ๋ถ๋ถ! alert์ mockImplementation ํด์ค์ผ ํ๋ค. */
jest.spyOn(window, 'alert').mockImplementation(() => {});
describe('LoginPage.vue ๋จ์ํ
์คํธ', () => {
let wrapper = null;
beforeEach(() => {
wrapper = shallowMount(LoginPage);
});
test('id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.', async () => {
const id = await wrapper.find('#id');
const pw = await wrapper.find('#password');
const idValue = id.element.value;
const pwValue = pw.element.value;
if (!idValue || !pwValue) {
alert('id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์.');
}
});
});

์ถ๊ฐ ํ ํ์๋ ์ฑ๊ณต์ ์ผ๋ก Pass ํ๊ฒ์ ์ ์ ์๋ค.
<!-- LoginPage.vue -->
<template>
<div>
<form @submit.prevent="submit">
<label>Id :</label>
<input type="text" id="id" v-model="form.id" /> <br /><br />
<label>Pw :</label>
<input type="password" id="password" v-model="form.password" /> <br /><br />
</form>
</div>
</template>
<script>
import { reactive } from 'vue';
export default {
setup() {
const form = reactive({
id: '',
password: '',
});
//submit ํจ์ ์ถ๊ฐ!
const submit = () => {
if (!form.id || !form.password) {
alert('id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์.');
return false;
}
};
return {
form,
submit,
};
},
};
</script>
<style></style>
//loginpage.test.js
import LoginPage from '../LoginPage.vue';
import { shallowMount } from '@vue/test-utils';
//alert ๊ฐ์ง ํจ์ ๋ง๋ค๊ธฐ
jest.spyOn(window, 'alert').mockImplementation(() => {});
describe('LoginPage.vue ๋จ์ํ
์คํธ', () => {
let wrapper = null;
beforeEach(() => {
wrapper = shallowMount(LoginPage);
});
test('id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.', async () => {
const id = await wrapper.find('#id');
const pw = await wrapper.find('#password');
const idValue = id.element.value;
const pwValue = pw.element.value;
await wrapper.find('form').trigger('submit.prevent');
if (!idValue || !pwValue) {
//alert์ ํธ์ถํ๋ฉด์ alert์ ์ด๋ค ์ธ์๋ฅผ ๋ฃ์๋์ง ํ
์คํธ ํ๋ค.
expect(alert).toBeCalledWith('id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์.');
}
});
});
์ฒ์์๋ test์ฝ๋์์ alert์ ํธ์ถํ์์ผ๋, ์์ฑํ๋ค๋ณด๋ ์๋ณธํ์ผ์์ alert์ ํธ์ถํ๋๊ฒ ๋ง๋๊ฒ ๊ฐ์, LoginPage.vue์ id,pw์ ๋น์ด์์ ๊ฒฝ์ฐ ์ถ๊ฐํ์๋ค.
๊ทธ๋ฆฌ๊ณ loginpage.test.js์์๋ idValue,pwValue๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ alertํจ์๊ฐ "id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์." ๋ฅผ ํธ์ถํ์๋์ง ํ์ธํ๊ธฐ ์ํด toBeCalledWith๋ฅผ ์ฌ์ฉํ์๋ค.
//loginpage.test.js
import LoginPage from '../LoginPage.vue';
import { shallowMount } from '@vue/test-utils';
//alert ๊ฐ์ง ํจ์ ๋ง๋ค๊ธฐ
jest.spyOn(window, 'alert').mockImplementation(() => {});
describe('LoginPage.vue ๋จ์ํ
์คํธ', () => {
let wrapper = null;
beforeEach(() => {
wrapper = shallowMount(LoginPage);
});
test('id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.', async () => {
await wrapper.find('form').trigger('submit.prevent');
//๋น์ด์์๊ฒฝ์ฐ LoginPage.vue์์ alert๋ฅผ ํธ์ถํ ๊ฒ์ด๊ณ , ์ฌ๊ธฐ์์ ํธ์ถ์ฌ๋ถ๋ฅผ ํ์
ํ ์ ์๋๋ก ๋ณ๊ฒฝํ์๋ค.
expect(alert).toBeCalledWith('id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์.');
// mock์ ํ๊ณ ๋์ clearํ๋๊ฒ์ด ์ข๋ค
alert.mockClear();
});
});

if๋ฌธ์ ์ญ์ ํ์๋ค. ์ด๋ฏธ submit ํจ์๋ฅผ ํตํด ๊ฐ์ด ๋น์ด์์ ๊ฒฝ์ฐ alert์ ํธ์ถํ๊ธฐ ๋๋ฌธ์ loginpage.test.js์์ ํธ์ถ์ฌ๋ถ๋ง ํ์ธํ๋๋ก ๋ฐ๊พธ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก mockClear๋ฅผ ํตํด ๋น์์คฌ๋ค.
์ด๋ก์ 4๊ฐ์ง ํ ์คํธ ์ผ์ด์ค ์ค ํ๊ฐ์ง๊ฐ ํด๊ฒฐ๋์๋ค.
id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.- id/pw ์ ๋ ฅ ํ ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๊ฒฝ์ฐ main์ผ๋ก ์ด๋
- ๋ก๊ทธ์ธ์ ์ ๋ณด๊ฐ ๋ง์ง ์๋ ๊ฒฝ์ฐ
- ๋ก๊ทธ์ธ api์์ ์๋ฒ์๋ฌ๊ฐ ๋ฐ์ ํ ๊ฒฝ์ฐ
๐ฅ ํ ์คํธ ์ผ์ด์ค 2 : id/pw ์ ๋ ฅ ํ ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๊ฒฝ์ฐ main์ผ๋ก ์ด๋
๐พ ์ฌ์ ์์
//loginpage.test.js
//์๋กญ๊ฒ ์ถ๊ฐ
import { login } from '@/api/login';
//api/login์ ์ ์ฒด๋ก mock ๋ง๋ค๊ธฐ
jest.mock('@/api/login');
๋ก๊ทธ์ธ api๋ฅผ import ํ๊ณ @/api/login ๋ถ๋ถ์ mock ํด์ค๋ค.
<!-- LoginPage.vue -->
<template>
<div>
<form @submit.prevent="submit">
<label>Id :</label>
<input type="text" id="id" v-model="form.id" /> <br /><br />
<label>Pw :</label>
<input type="password" id="password" v-model="form.password" /> <br /><br />
</form>
</div>
</template>
<script>
import { reactive } from 'vue';
import { login } from '@/api/login';
export default {
setup() {
const form = reactive({
id: '',
password: '',
});
const submit = () => {
if (!form.id || !form.password) {
alert('id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์.');
return false;
}
login({
UserId: form.id,
PassWord: form.password,
});
};
return {
form,
submit,
};
},
};
</script>
<style></style>
> ์ฌ๊ธฐ์๋ api๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ด ์๋ค. submit์ ํธ์ถ ํ ๋ loginํจ์๋ฅผ ํธ์ถํ์ loginํจ์๋ axios๋ฅผ ํตํด์ ํ์์ธ์ฆํ๋ ํจ์์ด๋ค.
test('id/pw ์
๋ ฅ ํ ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๊ฒฝ์ฐ main์ผ๋ก ์ด๋', async () => {
login.mockImplementation(() => {});
await wrapper.find('#id').setValue('chleorjs37@gmail.com');
await wrapper.find('#password').setValue('testpassword');
await wrapper.find('form').trigger('submit.prevent');
await expect(login).toHaveBeenCalled();
});

> login ๋ถ๋ถ์ ์ฆ์ ๊ตฌํํ๋ค(๋ค์์ Promiseํํ๋ก ๋ฐ๊ฟ ์์ ์ด๋ค.) ๊ทธ๋ฆฌ๊ณ login ํธ์ถ ํ์ธ์ ์ํด toHaveBeenCalled()๋ฅผ ์ฌ์ฉํ์๋ค.
ํ์ง๋ง loginํจ์๋ axiosํธ์ถ ์ด๋ฏ๋ก return์ Promise์ผ๋ก ๋ฆฌํดํ๋ค. ๊ทธ๋ฆฌํ์ฌ login.mockImplementation(() => {}) ๋ถ๋ถ์ Promiseํํ๋ก return ํ๊ฒ ๋ง๋ค์.
test('id/pw ์
๋ ฅ ํ ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๊ฒฝ์ฐ main์ผ๋ก ์ด๋', async () => {
//Promiseํํ๋ก ๋ฆฌํดํ๋ฉด์ status๋ 201๋ก ๋๋ ค์ค๋ค.
login.mockImplementation(() => {
return new Promise(resolve => {
resolve({
status: 201,
});
});
});
await wrapper.find('#id').setValue('chleorjs37@gmail.com');
await wrapper.find('#password').setValue('testpassword');
await wrapper.find('form').trigger('submit.prevent');
await expect(login).toHaveBeenCalled();
expect(alert).toBeCalledWith('๋ก๊ทธ์ธ ๋์์ต๋๋ค.');
});

login๋ถ๋ถ์ Promiseํํ๋ก ๋ณ๊ฒฝํ์๋ค. ์ํ๋ฅผ 201๋ก ๋๋ ค์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ฑ๊ณต์ ์ผ ๊ฒฝ์ฐ alert์ ํธ์ถํ์๋์ง ํ์ธํ๊ธฐ ์ํด toBeCalledWith์ผ๋ก ํ์ธํ์๋ค.
ํ์ง๋ง ์์ง router.push('/main') ์ ํธ์ถํ์๋์ง๋ ํ ์คํธ ํ์ง ์์๋ค.
//loginpage.test.js
import { useRouter } from 'vue-router';//vue-router mock
jest.mock('vue-router', () => ({
useRouter: jest.fn(() => ({
push: () => {},
})),
}));
์ค์ router๊ฐ ์๋ ๊ฐ์ง ํธ์ถ์ ํ๊ธฐ์ํด vue-router๋ฅผ mock๋ง๋ค์ด์ฃผ๊ณ , ๋น ํจ์ push๋ฅผ ๋ง๋ค์ด์ค๋ค.
//loginpage.test.js
//push ํธ์ถ ์ฌ๋ถ ๊ฐ์๋ฅผ ์ํด ๊ฐ์ง ํจ์ ๋ง๋ค๊ธฐ
let push = null;
beforeEach(() => {
push = jest.fn();
useRouter.mockImplementation(() => ({
push,
}));
wrapper = shallowMount(LoginPage);
});
useRouter์์ ์ฆ์ํจ์๋ฅผ ๊ตฌํํ๋ฉด์, push๋ฅผ ๊ฐ์ง ํจ์๋ก ๋ง๋ ๋ค.
test('id/pw ์
๋ ฅ ํ ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๊ฒฝ์ฐ main์ผ๋ก ์ด๋', async () => {
// ์ ์ฝ๋ ์๋ต
expect(push).toHaveBeenCalledWith('/main');
})
push๊ฐ '/main'์ผ๋ก ํธ์ถํ์๋์ง ๊ฒ์ฌํ๊ธฐ ์ํด toHaveBeenCalledWith๋ฅผ ์ฌ์ฉํ์๋ค.

ํ์ง๋ง ์ค๋ฅ๊ฐ ๋ฌ๋ค. LoginPage ์์๋ ์ค์ ๋ก ํธ์ถํ์ ์ด ์๋ค๋๊ฒ ๊ฐ๋ค. "LoginPage.vue"์์ router ํธ์ถํ๋ ๋ถ๋ถ์ ์ถ๊ฐํ์
//LoginPage.vue
const submit = () => {
if (!form.id || !form.password) {
alert('id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์.');
return false;
}
login({
UserId: form.id,
PassWord: form.password,
})
.then(value => {
const { status } = value;
if (status === 201) {
alert('๋ก๊ทธ์ธ ๋์์ต๋๋ค.');
//router.push ํธ์ถ
router.push('/main');
}
})
.catch(err => {});
};

vueํ์ผ์์ router.push('/main')์ ํธ์ถํ์๋๋, PASS๋ฅผ ๋จ๋๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ก์ 4๊ฐ์ง ํ ์คํธ ์ผ์ด์ค ์ค ๋๊ฐ์ง๊ฐ ํด๊ฒฐ๋์๋ค.
id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.id/pw ์ ๋ ฅ ํ ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๊ฒฝ์ฐ main์ผ๋ก ์ด๋- ๋ก๊ทธ์ธ์ ์ ๋ณด๊ฐ ๋ง์ง ์๋ ๊ฒฝ์ฐ
- ๋ก๊ทธ์ธ api์์ ์๋ฒ์๋ฌ๊ฐ ๋ฐ์ ํ ๊ฒฝ์ฐ
๐ ํ ์คํธ ์ผ์ด์ค 3 : ๋ก๊ทธ์ธ์ ์ ๋ณด๊ฐ ๋ง์ง ์๋ ๊ฒฝ์ฐ
> ๋ก๊ทธ์ธ์ด ์คํจํ๋ ๊ฒฝ์ฐ๋ http code๊ฐ 201๋ฉด์, code:'NOT_VALID' ์ธ ๊ฒฝ์ฐ "๋ก๊ทธ์ธ์ ๋ณด๊ฐ ๋ง์ง ์๋ค" ๋ผ๊ณ ๊ฐ์ ํ๋ค.
test('๋ก๊ทธ์ธ์ ์ ๋ณด๊ฐ ๋ง์ง ์๋ ๊ฒฝ์ฐ', () => {
login.mockImplementation(() => {
return new Promise(resolve => {
resolve({
status: 500,
code: 'NOT_VALID',
});
});
});
});
์ผ๋จ login์ ์ฆ์ ๊ตฌํํ์ฌ, status: 500 && code:'NOT_VALID' ์ผ๋ก Promise์ผ๋ก ๋ฆฌํดํ๋ค.
test('๋ก๊ทธ์ธ์ ์ ๋ณด๊ฐ ๋ง์ง ์๋ ๊ฒฝ์ฐ', async () => {
login.mockImplementation(() => {
return new Promise((_, reject) => {
reject({
status: 500,
code: 'NOT_VALID',
});
});
});
await wrapper.find('#id').setValue('chleorjs37@gmail.com');
await wrapper.find('#password').setValue('testpassword');
await wrapper.find('form').trigger('submit.prevent');
expect(alert).toBeCalledWith('๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ํ์ธํด์ฃผ์ธ์.');
});
๋๊ฐ์ด submit์ ํธ๋ฆฌ๊ฑฐ ์์ผ toBeCalledWith์ ์ด์ฉํ์ฌ alert์ ํธ์ถํ๋์ง ํ์ธํด๋ณธ๋ค.

ํ์ง๋ง ์๋ฌ๊ฐ ๋ฌ๋ค. ์ด๊ฒ์ ์ค์ ์ฝ๋์์ err ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์์ ์๊ธด๋ฌธ์ ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ค์ ์ฝ๋์์๋ err์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
//LoginPage.vue
// form์์ submitํ๋ ํจ์
const submit = () => {
if (!form.id || !form.password) {
alert('id๋๋ pw๋ฅผ ํ์ธํด์ฃผ์ธ์.');
return false;
}
login({
UserId: form.id,
PassWord: form.password,
})
.then(value => {
const { status, data } = value;
if (status === 201) {
alert('๋ก๊ทธ์ธ ๋์์ต๋๋ค.');
router.push('/main');
}
})
.catch(err => {
const { status, code } = err;
//์๋ฌ์ ๋ํ ์ถ๊ฐ๋ ๋ถ๋ถ
if (status === 500 && code === 'NOT_VALID') {
alert('๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ํ์ธํด์ฃผ์ธ์.');
}
});
};

๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๋ง์ง ์๋ ๊ฒฝ์ฐ PASS๊ฐ ๋์๋ค.
์ด๋ก์ 4๊ฐ์ง ํ ์คํธ ์ผ์ด์ค ์ค ์ธ๊ฐ์ง๊ฐ ํด๊ฒฐ๋์๋ค.
id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.id/pw ์ ๋ ฅ ํ ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๊ฒฝ์ฐ main์ผ๋ก ์ด๋๋ก๊ทธ์ธ์ ์ ๋ณด๊ฐ ๋ง์ง ์๋ ๊ฒฝ์ฐ- ๋ก๊ทธ์ธ api์์ ์๋ฒ์๋ฌ๊ฐ ๋ฐ์ ํ ๊ฒฝ์ฐ
๐ ํ ์คํธ ์ผ์ด์ค 4 : ๋ก๊ทธ์ธ API์์ ์๋ฒ์๋ฌ๊ฐ ๋ฐ์ ํ ๊ฒฝ์ฐ
๋จ์ํ ์๋ฒ์์ 500์ returnํด์ค ๊ฒฝ์ฐ ์๋ฒ์์ ์๋ฌ๊ฐ ์๋ค๊ณ ๊ฐ์ฃผํ๋ค.
//loginpage.test.js
test('๋ก๊ทธ์ธ api์์ ์๋ฒ์๋ฌ๊ฐ ๋ฐ์ ํ ๊ฒฝ์ฐ', async () => {
login.mockImplementation(() => {
return new Promise((_, reject) => {
reject({
status: 500,
});
});
});
await wrapper.find('#id').setValue('chleorjs37@gmail.com');
await wrapper.find('#password').setValue('testpassword');
await wrapper.find('form').trigger('submit.prevent');
expect(alert).toBeCalledWith('์๋ฒ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.');
});
//LoginPage.vue
const submit = () => {
login({
UserId: form.id,
PassWord: form.password,
})
.then(value => {
const { status, data } = value;
if (status === 201) {
alert('๋ก๊ทธ์ธ ๋์์ต๋๋ค.');
router.push('/main');
}
})
.catch(err => {
const { status, code } = err;
if (status === 500 && code === 'NOT_VALID') {
alert('๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ํ์ธํด์ฃผ์ธ์.');
} else if (status === 500) {
//์ถ๊ฐ๋ ๋ถ๋ถ
alert('์๋ฒ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.');
}
});
}

submitํจ์์์ alertํจ์๋ฅผ ํธ์ถํ์๋์ง toBeCalledWith๋ฅผ ํตํด์ ํ์ธํ์๊ณ , PASS๊ฐ ๋ฌ์ง ํ์ธ ํ ์ ์๋ค.
์ด๋ก์ 4๊ฐ์ง ํ ์คํธ ์ผ์ด์ค ๋ชจ๋ ํด๊ฒฐํ์๋ค.
id/pw ๋น์ด์์ ๊ฒฝ์ฐ alert์ ๋์ด๋ค.id/pw ์ ๋ ฅ ํ ์ฑ๊ณต์ ์ผ๋ก ๋๋ ๊ฒฝ์ฐ main์ผ๋ก ์ด๋๋ก๊ทธ์ธ์ ์ ๋ณด๊ฐ ๋ง์ง ์๋ ๊ฒฝ์ฐ๋ก๊ทธ์ธ api์์ ์๋ฒ์๋ฌ๊ฐ ๋ฐ์ ํ ๊ฒฝ์ฐ
๊ฐ๋จํ ๋ก๊ทธ์ธ ๊ตฌํ์ jest๋ฅผ ์ด์ฉํด๋ณด์๋ค. ๊ฐ๋จํ ์์ ๊ฐ์ง๋ง, mock ํ๋ ๊ฒ๋ถํฐ , ํธ์ถ์ฌ๋ถ ํ์ธ ๊น์ง ์๊ฐ๋ณด๋ค ํ๊ฑธ์ํ๊ฑธ์ ์ฝ์ง๋ ์์๋ค. ์ค๋ฌด์์ ์ธ ์ ์๋๋ก ํ์์ ์ฐ์ต์ ๋ง์ด ํ๋๋ก ํ์.
'Vue' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๐ vscode ์์ EditorConfig ์ฐ๊ธฐ (0) | 2023.06.02 |
|---|---|
| Vue + jest + typescript ์ธํ (0) | 2023.05.01 |
| ๐ vue jest router ์๊ธด ๋ฌธ์ (0) | 2023.03.16 |
| ๐ vue jest study๊ธฐ๋ก (0) | 2023.03.03 |
| ๐ vue์์ scss๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ theme๋ณ๋ก ๊ด๋ฆฌํด๋ณด๊ธฐ (2) | 2023.01.24 |
๋๊ธ