@storyshots/arrangers
Функции и утилиты для работы с externals в arrange фазе истории.
createArrangers
Создаёт основные утилиты и привязывает их к базовому типу externals:
import { createArrangers } from '@storyshots/arrangers';
interface IExternals {
analytics: {
log(event: string): void;
};
business: {
getBalanceAt(date: number): Promise<number>;
applyCV(form: unknown): Promise<void>;
};
route: string;
}
const utils = createArrangers<IExternals>();
set
Устанавливает значение для описанного ключа:
it('...', {
// Метод getBalanceAt теперь имеет другую реализацию
arrange: set('business.getBalanceAt', async () => 100_000),
});
record
Делает переданные методы отслеживаемыми:
it('...', {
// Вызовы getBalanceAt теперь будут записаны в журнал
arrange: record('business.getBalanceAt'),
});
Также может принимать реализацию:
it('...', {
// Помимо записи, также будет установлено и поведение
arrange: record('business.getBalanceAt', async () => 100_000),
});
transform
Преобразует возвращаемое значение метода:
it('...', {
arrange: transform('business.getBalanceAt', (balance) => balance * 2),
});
Работает только с асинхронными функциями. Для всех других, рекомендуется compose
compose
Устанавливает новое значение на базе текущего:
it('...', {
arrange: compose('route', (path) => (path === '/login' ? '/' : path)),
});
focus
Фокусирует arrangers на вложенном свойстве:
import { createArrangers } from '@storyshots/arrangers';
interface IExternals {
repositories: {
UserRepository: {
getUser(): Promise<void>;
};
};
route: string;
}
const utils = createArrangers<IExternals>();
// Создаём arrangers сфокусированные на repositories.
export const repository = utils.focus('repositories');
Далее созданные утилиты можно использовать в историях следующим образом:
it('...', {
// Путь до свойства теперь сокращён
arrange: repository.set('UserRepository.getUser', async () =>
createAdminUserStub(),
),
});
arrange
Функция объединяющая несколько arrangers в один:
it('...', {
arrange: arrange(
set('business.getBalanceAt', () => 100_000),
record('analytics.log'),
),
});
arrange можно вкладывать один в другой:
it('...', {
arrange: arrange(withZeroBalance(), withApplyCVSuccess()),
});
function withZeroBalance() {
return set('business.getBalanceAt', () => 0);
}
function withApplyCVSuccess() {
return arrange(
set('business.applyCV', async () => 'success'),
record('business.applyCV'),
);
}
Можно описывать inline arrange:
it('...', {
arrange: arrange(
set('business.getBalanceAt', () => 0),
// Можно вынести в отдельную функцию
(externals) => {
clock.set(new Date(/* ... */));
return externals;
},
),
});
resolves
Создаёт функцию возвращающую Promise.resolve с переданным значением:
it('...', {
arrange: set('business.getBalanceAt', resolves(0)),
});
rejects
Создаёт функцию возвращающую Promise.reject с переданным значением:
it('...', {
arrange: set('business.getBalanceAt', rejects('Balance not found')),
});