Фабрика тестових даних
Factory інкапсулює створення об'єкта. У TypeScript-тестах найпопулярніший варіант це проста функція з дефолтами і Partial override:
export function createCard(overrides: Partial<Card> = {}): Card {
return {
number: '4111111111111111',
holder: 'TEST USER',
expiry: '12/30',
cvv: '123',
...overrides,
};
}
const expired = createCard({ expiry: '01/20' });
Це коротше за Builder і повністю типізовано: TypeScript не дасть передати поле, якого немає в Card.
Друга популярна форма це фабрика, яка не лише будує об'єкт, а й створює сутність у системі через API:
export async function createAccountViaApi(
request: APIRequestContext,
overrides: Partial<NewAccount> = {},
) {
const res = await request.post('/api/accounts', {
data: { currency: 'EUR', ...overrides },
});
expect(res.ok()).toBeTruthy();
return (await res.json()) as Account;
}
Таку функцію зручно загорнути у фікстуру, щоб додати cleanup після use.
Нюанс зі spread: overrides з полем undefined перезапише дефолт на undefined. Для вкладених об'єктів spread поверхневий, тому вкладені override треба мержити окремо.
Partial override, це коротко і типобезпечно. Фабрики, що створюють сутності через API, обгортаю у фікстури, щоб був гарантований cleanup.