🧪 Unit Test
Unit Testing คือการทดสอบฟังก์ชันหรือส่วนย่อยของโค้ดแต่ละตัวแยกกัน
1. Basic Jest Matchers
// ตัวอย่าง Jest Matchers ที่ใช้บ่อย
describe('Basic Jest Matchers', () => {
test('equality matchers', () => {
expect(2 + 2).toBe(4); // ตรวจสอบค่าเท่ากัน
expect({ name: 'John' }).toEqual({ name: 'John' }); // ตรวจสอบ object
});
test('truthiness matchers', () => {
expect(true).toBeTruthy(); // ค่าที่เป็น true
expect(false).toBeFalsy(); // ค่าที่เป็น false
expect('hello').toBeTruthy(); // string ไม่ว่าง = truthy
expect('').toBeFalsy(); // string ว่าง = falsy
expect(null).toBeNull(); // ตรวจสอบ null
expect(undefined).toBeUndefined(); // ตรวจสอบ undefined
});
test('number matchers', () => {
expect(2 + 2).toBeGreaterThan(3); // มากกว่า
expect(2 + 2).toBeGreaterThanOrEqual(4); // มากกว่าหรือเท่ากับ
expect(2 + 2).toBeLessThan(5); // น้อยกว่า
expect(0.1 + 0.2).toBeCloseTo(0.3); // ใกล้เคียง (สำหรับ float)
});
test('string matchers', () => {
expect('hello world').toMatch(/world/); // ตรงกับ regex
expect('hello world').toContain('hello'); // มีคำนี้อยู่
});
test('array matchers', () => {
expect(['apple', 'banana', 'orange']).toContain('banana');
expect(['apple', 'banana']).toHaveLength(2);
});
test('exception matchers', () => {
const throwError = () => {
throw new Error('Something went wrong');
};
expect(throwError).toThrow();
expect(throwError).toThrow('Something went wrong');
});
});2. Testing Functions with Side Effects
// utils/storage.js - ฟังก์ชันที่มี side effects
export function saveToLocalStorage(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
return true;
} catch (error) {
return false;
}
}
export function getFromLocalStorage(key) {
try {
const item = localStorage.getItem(key);
return item ? JSON.parse(item) : null;
} catch (error) {
return null;
}
}
// __tests__/storage.test.js
import { saveToLocalStorage, getFromLocalStorage } from '../utils/storage';
// Mock localStorage เพราะ Jest ไม่มี localStorage
const localStorageMock = {
getItem: jest.fn(),
setItem: jest.fn(),
removeItem: jest.fn(),
clear: jest.fn(),
};
global.localStorage = localStorageMock;
describe('Local Storage Utils', () => {
beforeEach(() => {
// ล้าง mock ก่อนแต่ละ test
jest.clearAllMocks();
});
test('should save data to localStorage', () => {
const testData = { name: 'John', age: 30 };
const result = saveToLocalStorage('user', testData);
expect(result).toBe(true);
expect(localStorage.setItem).toHaveBeenCalledWith(
'user',
JSON.stringify(testData)
);
});
test('should retrieve data from localStorage', () => {
const testData = { name: 'John', age: 30 };
localStorage.getItem.mockReturnValue(JSON.stringify(testData));
const result = getFromLocalStorage('user');
expect(result).toEqual(testData);
expect(localStorage.getItem).toHaveBeenCalledWith('user');
});
test('should handle localStorage errors', () => {
localStorage.setItem.mockImplementation(() => {
throw new Error('Storage full');
});
const result = saveToLocalStorage('user', { name: 'John' });
expect(result).toBe(false);
});
});