๐์์ํ๋ฉฐ
์ด์ ํฌ์คํ
์์ ํ
์คํธ์ ์์ ํ
์คํธ์ ๋ฐฐ๊ฒฝ๊ณผ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํด๋ดค๋ค๋ฉด, ์ด๋ฒ์๋ ์ค์ ๋ก ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ api๋ฅผ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
โ
it
it ํจ์๋ฅผ ์ฌ์ฉํด ํน์ ๋์์ด๋ ๊ฒฐ๊ณผ์ ๋ํ ๊ธฐ๋๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ๊ฒ์ฆํ๋ ํ
์คํธ ์ฝ๋๋ฅผ ์์ ์์ฑํ๊ฒ ๋๋ค. it ํจ์ ์์ ์์ฑ๋๋ ์ค๋ช
์ ํ
์คํธ ๋ชฉ์ , ๊ธฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ช
ํํ๊ฒ ์์ฑํ๋๋ก ํ๋ค.
๋ํ, it ํจ์๋ test ํจ์์ alias(๋์ฒด ์ด๋ฆ)์ผ๋ก, ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๋๋ฐ, ๋๋ it์ผ๋ก ์์ฑํ๋๊ฑธ ์ ํธํ๋ค.
1
2
3
4
5
6
| import { it, expect } from "vitest"
it("2์ 3์ ๋ํ๋ฉด 5๊ฐ ๋์ด์ผ ํ๋ค.", () => {
const result = 2 + 3
expect(result).toBe(5)
})
|
โ
desribe
describe๋ it์ด๋ test๋ก ์์ฑ๋ ์ฌ๋ฌ ๊ฐ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๊ทธ๋ฃนํํด ์ปดํฌ๋ํธ ์์ ์ฌ๋ฌ ํ
์คํธ๋ฅผ ๊ฐ๋
์ฑ ์๊ฒ ์ ๋ฆฌํ ์ ์๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
| import { describe, it, expect } from "vitest"
describe("๊ณ์ฐ ๊ธฐ๋ฅ", () => {
it("2์ 3์ ๋ํ๋ฉด 5๊ฐ ๋์ด์ผ ํ๋ค.", () => {
const result = 2 + 3
expect(result).toBe(5)
})
it("5์์ 2๋ฅผ ๋นผ๋ฉด 3์ด ๋์ด์ผ ํ๋ค.", () => {
const result = 5 - 2
expect(result).toBe(3)
})
})
|
โ
expect
๊ฒฐ๊ณผ๋ฅผ ์ต์ข
์ ์ผ๋ก ๊ฒ์ฆํ๋๋ฐ ์ฌ์ฉํ๋ค. expect๋ ๋จ์ธ๋ฌธ์ผ๋ก์จ, ํน์ ์กฐ๊ฑด์ด๋ ์ํ๊ฐ ์ฐธ์ธ์ง ํ์ธํ๋ค. ์์์ ์ดํด๋ณธ ์์ ๋ฅผ ๋ณด๋ฉด expect๋ฅผ ์์ ํด๋น ๊ธฐ๋ฅ์ ๊ฐ์ด 5์ผ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋จ์ธํ๊ณ ์ด๋ฅผ ๊ธฐ์ค์ ๋๊ณ ์ฐธ๊ณผ ๊ฑฐ์ง์ ํ๋ณํ๊ฒ ๋๋ค.
1
2
3
4
5
6
| import { it, expect } from "vitest"
it("2์ 3์ ๋ํ๋ฉด 5๊ฐ ๋์ด์ผ ํ๋ค.", () => {
const result = 2 + 3
expect(result).toBe(5)
})
|
โก๏ธmatcher
expect๋ฅผ ์ด์ฉํ ๋ matcher๋ฅผ ์ด์ฉํด ์ด๋ค ๊ฐ์ ๊ธฐ๋ํ๋์ง ์ ํํ ์์ฑํด์ค ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์์์ ๋ณธ ์์๋ฅผ ๋ค์ ํ๋ฒ ์ดํด๋ณด๋ฉด,
์ด๋ ๊ฒ expect ๋ค์ toBe
๊ฐ ์ฐ๊ฒฐ๋์ด์๋๋ฐ ์ด ๋ป์ โ5โ๊ฐ ๋ ๊ฒ์ด๋ค. ๋ผ๋ ์๋ฏธ๋ก ๊ธฐ๋ํ๋ค โ๋ฌด์์ด ๋ ์งโ ์ โ๋ฌด์์ด ๋ ์งโ์ ์ญํ ์ ๋ด๋นํ๋ ๊ฒ์ผ๋ก ์๊ฐํ ์ ์๋ค.
matcher์๋ ๋ค์ํ ๊ฒ๋ค์ด ์๋๋ฐ, ์์ธํ ๋ด์ฉ์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ฉด ๋๋ค.
๐toBe / toEqual / toStrictEqual
- toBe ๋ ๊ฐ์ด ์๊ฒฉํ๊ฒ ๋์ผ(===)ํ์ง ํ์ธํ๋ค.
- toEqual ์ ๊ฐ์ฒด๋ ๋ฐฐ์ด ๊ฐ์ ๋น๊ตํ๋ค.
- toStrictEqual ์ undefined ์์ฑ๊น์ง ํฌํจํด ๋ ์๊ฒฉํ ํ์ธํ๋ค.
1
2
| expect(2 + 2).toBe(4)
expect({ a: 1 }).toEqual({ a: 1 })
|
๐toBeTruthy / toBeFalsy
- toBeTruthy ๋ ๊ฐ์ด truthyํ์ง (์ฆ, true๋ก ํ๊ฐ๋๋์ง) ํ์ธํ๋ค.
- toBeFalsy ๋ ๊ฐ์ด falsy(์ฆ, false๋ก ํ๊ฐ๋๋์ง) ํ์ธํ๋ค.
1
2
| expect(true).toBeTruthy()
expect(0).toBeFalsy()
|
๐toBeNull / toBeUndefined / toBeDefined
- toBeNull ์ ๊ฐ์ด null์ธ์ง ํ์ธํ๋ค.
- toBeUndefined undefined์ธ์ง ํ์ธํ๋ค.
- toBeDefined ๋ ๊ฐ์ด ์ ์๋์ด ์๋์ง ํ์ธํ๋ค.
1
2
| expect(null).toBeNull()
expect(undefined).toBeUndefined()
|
๐toBeGreaterThan / toBeLessThan / toBeGreaterThanOrEqual / toBeLessThanOrEqual
- toBeGreaterThan ์ ๊ฐ์ด ๋ค๋ฅธ ๊ฐ๋ณด๋ค ํฐ์ง ํ์ธํ๋ค.
- toBeLessThan ์ ๊ฐ์ด ๋ค๋ฅธ ๊ฐ๋ณด๋ค ์์์ง ํ์ธํ๋ค.
- toBeGreaterThanOrEqaul ์ ๊ฐ์ด ๋ค๋ฅธ ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ง ํ์ธํ๋ค.
- toBeLessThanOrEqaul ์ ๊ฐ์ด ๋ค๋ฅธ ๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ง ํ์ธํ๋ค.
1
2
| expect(10).toBeGreaterThan(5)
expect(5).toBeLessThanOrEqual(5)
|
๐ toContain / toContainEqual
- toContain์ ๋ฐฐ์ด์ด๋ ๋ฌธ์์ด์ ํน์ ๊ฐ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ๋ค.
- toContainEqual์ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ํน์ ๊ฐ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ๋ค.
1
2
| expect([1, 2, 3]).toContain(2)
expect([{ a: 1 }, { b: 2 }]).toContainEqual({ b: 2 })
|
๐toHaveLength / toHaveProperty
- toHaveLength๋ ๋ฐฐ์ด, ๋ฌธ์์ด ๋ฑ์ ๊ธธ์ด๊ฐ ํน์ ๊ฐ๊ณผ ๋์ผํ์ง ํ์ธํ๋ค.
- toHaveProperty๋ ๊ฐ์ฒด๊ฐ ํน์ ์์ฑ์ ๊ฐ๊ณ ์๋์ง ํ์ธํ๋ค.
1
2
| expect([1, 2, 3]).toHaveLength(3)
expect({ a: 1, b: 2 }).toHaveProperty("b")
|
๐ toThrowError / toThrowErrorMatchingSnapshot
- toThrowError๋ ํจ์๊ฐ ํน์ ์๋ฌ๋ฅผ ๋์ง๋์ง ํ์ธํ๋ค.
- toThrowErrorMatchingSnapshot์ ์๋ฌ ๋ฉ์์ง๊ฐ ์ค๋
์ท ๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ค.
์ค๋
์ท: ํน์ ์์ ๋ฐ์ดํฐ๋ ์์คํ
์ํ๋ฅผ ์ ์ฅํด ๋๋ ๊ฒ
1
2
3
| expect(() => {
throw new Error("error message")
}).toThrowError("error message")
|
๐ toHaveBeenCalled / toHaveBeenCalledTimes / toHaveBeenCalledWith
- toHaveBeenCalled๋ ํจ์๊ฐ ํธ์ถ๋์๋์ง ํ์ธํ๋ค.
- toHaveBeenCalledTimes๋ ํธ์ถ ํ์๋ฅผ ํ์ธํ๋ค.
- toHaveBeenCalledWith๋ ํธ์ถ๋ ์ธ์(ํจ์๋ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ์ ๋ฌ๋ ๊ฐ)๋ฅผ ํ์ธํ๋ค.
1
2
3
4
5
| const mockFn = vi.fn()
mockFn("์ธ์")
expect(mockFn).toHaveBeenCalled()
expect(mockFn).toHaveBeenCalledWith("์ธ์")
|
๐resolves / rejects
- resolves๋ ํ๋ก๋ฏธ์ค๊ฐ resolves(ํด๊ฒฐ) ๋์์ ๋์ ๊ฐ์ ํ
์คํธํ๋ค.
- rejects๋ ํ๋ก๋ฏธ์ค๊ฐ rejects(๊ฑฐ๋ถ) ๋์์ ๋์ ๊ฐ์ ํ
์คํธํ๋ค.
1
2
| await expect(Promise.resolve("success")).resolves.toBe("success")
await expect(Promise.reject("error")).rejects.toBe("error")
|
๐expect.any / expect.anything
- expect.any(Class)๋ ๊ฐ์ด ํน์ ํด๋์ค์ ์ธ์คํด์ค์ธ์ง ํ์ธํ๋ค.
- expect.anything()์ null๊ณผ undefined๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ฐ์ ๋ํด ์ฑ๊ณตํ๋ค.
1
2
| expect(123).toEqual(expect.any(Number))
expect("์๋ฌด๊ฑฐ๋ ์ ๋ถ ์ฑ๊ณต!").toEqual(expect.anything())
|
โ
vi
vi๋ ๋ชจ๋์ ๋ชจํน(mocking) ํ๊ฑฐ๋, ํจ์์ ํธ์ถ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉํ๋ค.
- ๋ชจํน(mocking): ํน์ ๊ธฐ๋ฅ์ด๋ ๊ฐ์ฒด์ ๋์์ ํ๋ด๋ด๊ฑฐ๋ ๋์ฒดํ๋ค.
๋ง์ด ์ข ์ดํด๊ฐ ์ด๋ ค์ด๋ฐ, A ๋ก์ง์ด ๋ฌด์ธ๊ฐ(B)๋ฅผ ์์กดํด์ ๊ตฌํ๋๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด๋ A ๋ก์ง ํ
์คํธ๋ฅผ ์ํด์๋ B๊ฐ ํ์ํ์ง๋ง, B๋ฅผ ๊ตฌํํ๊ธฐ ๋ณต์กํ ๋๋ ๋ชจํน์ ํตํด B๋ฅผ ๋์ฒดํ์ฌ A ๋ก์ง์ ๊ฒ์ฆํ ์ ์๊ฒ ๋๋ค.
โก๏ธ ๋ชจํน
๋ชจํน์ vi.fn()
์ ์ฌ์ฉํด ๊ฐ๋จํ ๊ตฌํํ๋ค. ์ด๋ฅผ ํตํด ํน์ ๋ก์ง์ ๋์ฒดํ ์ ์๋ ๊ฐ์์ ํจ์๋ฅผ ์์ฑํ ์ ์๋ค.
โก๏ธ ์คํ์ด
vi.spyOn()
์ ์ฌ์ฉํด ํน์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ๊ฐ์ํด ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง, ์ด๋ค ์ธ์๋ก ํธ์ถ๋์๋์ง๋ฅผ ํ์ธํ ์ ์๋ค.
1
| const spy = vi.spyOn(๊ฐ์ฒด, "๊ฐ์ฒด ์์ ๋ฉ์๋ ์ด๋ฆ")
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| import { describe, it, expect } from "vitest"
const calculator = {
add: (a: number, b: number) => a + b,
}
describe("๊ณ์ฐ ๊ธฐ๋ฅ", () => {
it("2์ 3์ ๋ํ๋ฉด 5๊ฐ ๋์ด์ผ ํ๋ค.", () => {
// ์คํ์ด ์์ฑ
const spy = vi.spyOn(calculator, "add") //calculator ๊ฐ์ฒด์ ๊ฐ์ฒด์์ ๋ฉ์๋
// ๋ฉ์๋ ํธ์ถ
const result = calculator.add(2, 3) //์์์ ์ ์ํ add ๋ฉ์๋๋ฅผ ๋ถ๋ฌ์ด
// ๊ฒฐ๊ณผ ํ์ธ
expect(result).toBe(5) // ๊ฒฐ๊ณผ๊ฐ 5์ธ์ง ํ์ธ
// ์คํ์ด๋ฅผ ์ฌ์ฉํด ํธ์ถ ์ฌ๋ถ ๋ฐ ์ธ์ ํ์ธ
expect(spy).toHaveBeenCalled() // add ๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง ํ์ธ
expect(spy.mock.calls[0]).toEqual([2, 3]) // ์ฒซ ๋ฒ์งธ ํธ์ถ์ ์ธ์๊ฐ [2, 3]์ธ์ง ํ์ธ
})
})
|
โก๏ธ ํ์ด๋จธ ๋ชจํน
setTimeout
์ด๋ setInterval
์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ฅผ ํ
์คํธํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ ์ ์๊ฐ์ด ์ง๋ ํ์ ๋ฐ์์ ํ
์คํธ ํ๊ธฐ ์ํด์ ํ
์คํธ๋๋ง๋ค ๊ทธ ์๊ฐ์ ๊ธฐ๋ค๋ฆฐ๋ค๋ฉด ๋ฌด์ฒ ๋ฒ๊ฑฐ๋ก์ธ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ์ด๋ฌํ ๊ฒฝ์ฐ์๋ vi.useFakeTimers()
๋ฅผ ์ฌ์ฉํด ํ์ด๋จธ๋ฅผ ๋ชจํนํ์ฌ setTimeout, setInterval ๋ฑ์ ํ
์คํธํ ์ ์๋ค.
์ด๋ฅผ ํตํด, 5์ด ํ์ ์คํ ๋์ด์ผ ํ๋ ํ
์คํธ๊ฐ ์กด์ฌํ๋ค๊ณ ํ์ ๋, ํ
์คํธ๋ฅผ ์ํด 5์ด๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ ์ค์ผ ์ ์๋ค.
๋ค๋ง, ๊ฐ์ง ํ์ด๋จธ๋ฅผ ์คํํ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ก์ง์๋ ์ํฅ์ ์ค ์ ์์ผ๋ฏ๋ก, vi.useRealTimers()
๋ฅผ ์ด์ฉํด ์๋ ํ์ด๋จธ๋ก ๋ณต๊ตฌํด์ผํจ์ ์ ์ํ๋ค.
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
| import { vi, expect, it } from "vitest"
function runAfterDelay(callback: () => void, delay: number) {
setTimeout(callback, delay)
}
it("ํ์ด๋จธ๊ฐ 5์ด ํ์ ๋์ํด์ผ ํจ", () => {
// ํ์ด๋จธ๋ฅผ ๋ชจํน
vi.useFakeTimers()
// ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํ์ด๋ก ์ค์
const callback = vi.fn()
// ํจ์ ํธ์ถ
runAfterDelay(callback, 5000)
// ์์ง ์ฝ๋ฐฑ์ด ์คํ๋์ง ์์๋์ง ํ์ธ
expect(callback).not.toHaveBeenCalled()
// 5์ด๋ก ํ์ด๋จธ ๋น ๋ฅด๊ฒ ์งํ
vi.advanceTimersByTime(5000)
// ์ฝ๋ฐฑ์ด ์คํ๋์๋์ง ํ์ธ
expect(callback).toHaveBeenCalled()
// ํ์ด๋จธ ๋ณต๊ตฌ (์๋์ ํ์ด๋จธ๋ก ๋์๊ฐ๊ธฐ)
vi.useRealTimers()
})
|
โ
beforeEach & beforeAll
before~์ด๋ ์ด๋ฆ์์ ์ ์ถํ ์ ์๋ฏ์ด ํ
์คํธ ์ผ์ด์ค๊ฐ ์คํ๋๊ธฐ ์ ์ ํน์ ์์
์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ํ
์คํธ ์ผ์ด์ค๋ง๋ค ๋ฐ๋ณต์ ์ธ ์ปดํฌ๋ํธ ๋ ๋๋ง์ด ํ์ํ ๊ฒฝ์ฐ, before~๋ฅผ ์ฌ์ฉํ๋ฉด ํ ๋ฒ์ ๊น๋ํ๊ฒ ์์ฑํ ์ ์๋ค.
- beforeEach: ๊ฐ ํ
์คํธ ์คํ ์ ์ ํน์ ์์
์ํ
- beforeAll: ๋ชจ๋ ํ
์คํธ ์ผ์ด์ค ์คํ ์ ๋จ ํ ๋ฒ๋ง ํน์ ์์
์ํ (์ด๊ธฐํ ์์
๋ฑ)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| import { describe, beforeEach, beforeAll, it, expect } from "vitest"
let counter = 0
describe("beforeEach vs beforeAll ์ฐจ์ด์ ", () => {
// ํ
์คํธ๊ฐ ์คํ๋๊ธฐ ์ ์ ํ ๋ฒ๋ง ์คํ
beforeAll(() => {
counter = 10 // ๋ชจ๋ ํ
์คํธ์ ์ ์ฉํ ์ด๊ธฐ ์ค์ (์ต์ด 1ํ ์คํ)
})
// ๊ฐ ํ
์คํธ ์คํ ์ ์ ์คํ
beforeEach(() => {
counter += 1 // ํ
์คํธ๋ง๋ค ๊ฐ๋ณ์ ์ผ๋ก ์คํํ ์์
(๊ฐ ํ
์คํธ ๋ง๋ค 1ํ ์คํ)
})
it("์ฒซ ๋ฒ์งธ ํ
์คํธ", () => {
expect(counter).toBe(11) // beforeAll์ 10๊ณผ beforeEach +1 ์ ์ํด 11
})
it("๋ ๋ฒ์งธ ํ
์คํธ", () => {
expect(counter).toBe(12) // ์ฒซ ๋ฒ์งธ ํ
์คํธ ํ beforeEach๋ง ์ฌ์คํ๋์ด +1 ์ฆ 12
})
})
|
โ
afterEach & afterAll
beforeEach์ beforeAll๊ณผ ๋ฐ๋๋ก, ํ
์คํธ ํ์ ํน์ ์์
์ ์ํํ๋ค.
- afterEach: ๊ฐ ํ
์คํธ ์คํ ํ์ ํน์ ์์
์ํ
- afterAll: ๋ชจ๋ ํ
์คํธ ์ผ์ด์ค ์คํ ํ ๋จ ํ ๋ฒ๋ง ํน์ ์์
์ํ
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
| import { describe, afterEach, afterAll, it, expect } from "vitest"
let counter = 0
describe("afterEach์ afterAll ์ฐจ์ด์ ", () => {
// ๊ฐ ํ
์คํธ ์คํ ํ์ ์คํ
afterEach(() => {
counter -= 1 // ๊ฐ ํ
์คํธ๊ฐ ๋๋ ํ -1
})
// ๋ชจ๋ ํ
์คํธ๊ฐ ๋๋ ํ์ ์คํ
afterAll(() => {
counter -= 2
})
it("์ฒซ ๋ฒ์งธ ํ
์คํธ", () => {
counter += 1 // ์ด๊ธฐ๊ฐ 0 ์ + 1 = 1
expect(counter).toBe(1) // 1์ด ๋์ด์ผ ํจ
})
//์ดํ afterEach๊ฐ ์คํ ๋์ด 1 - 1 = 0
it("๋ ๋ฒ์งธ ํ
์คํธ", () => {
counter += 1 // 0์ + 1 = 1
expect(counter).toBe(1) // 1์ด ๋์ด์ผ ํจ
})
//๋ชจ๋ ํ
์คํธ๊ฐ ์ข
๋ฃ ๋์ด afterAll ์คํ 1 - 2 = -1
//์ด ์์ ์์ counter๋ -1
})
|
๐๏ธ์ฐธ๊ณ ์ฌ์ดํธ