Перейти к основному содержимому

@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')),
});