Комментарии 8
С учетом объемов работы это означало написать процесс заново.
Я так и не понял, вы всё-таки переписали весь сервис с нуля, или просто сделали большой рефакторинг с использованием idef-0?
Динамические require — адовое зло.
const someBackend = require('some-backend-module');
someBackend.checkPhone(inputData.phone)
Я понимаю циклические зависимости и все такое. Но как-то архитектура пахнет, сразу видны уши неграмотного архитектора одного из прошлых поколений, который связал вместе несколько модулей неправильно декомпозировав модули на части. Просто нужно разделять операции над данными от самих данных, тогда и циклических зависимостей не будет.
Плюс я бы на вашем месте все-таки внедрил бы flow или ts. Так хотя бы будет понятно какого типа у вас $flow и inputData. А так нужно постоянно проверять — есть ли нужное свойство, не свалимся с ошибкой. Плюс один глобальный объект to Rule them all — плохая практика. Все равно что в объекте request express держать глобальный объект data и пихать в него всю инфу. Опять же при запуске параллельном нескольких тестов — теряется главное свойство герметичность тестов. Т.е. чтобы один тест влиял на другие тесты.
Idef-0 Это ж те же самые reducers. Берите пример с фп и тестить проще
Конечно же мы стараемся покрывать наш код тестами. Для тестирования ProcessFlow был написан небольшой хэлпер,
который позволяет тестировать каждый функциональный блок процесса независимо. Вот пример кода теста:
const checkUserProcess = require('./check-user');
const processFlowStubHelper = require('process-flow-stub-helper');
const checkUserProcessStub = processFlowStubHelper(checkUserProcess);
it('should check userName successful', done => {
checkUserProcessStub.runStage('checkUserName', {
userName: 'testUser',
balance: 0
})
.onTransition((stageName, outputData) => {
stageName.should.be.eq('checkUserBalance');
outuputData.should.be.deep.eq({
userName: 'testUser',
balance: 0
});
done();
});
});
Вызываем необходимый функциональный блок с определенными данными и проверяем выходы этого блока. Код тестов получается достаточно простой и понятный.
Глобальных объектов в ProcessFlow нет, все объекты приходят в качестве аргументов функции и являются для нее локальными. Сам ProcessFlow поставляется модулем и подключается через require, там где он нужен. Что вы имели в виду под глобальным объектом?
На TypeScript мы переодически смотрим — например, сейчас есть большой монолитный проект. Если активно добавлять туда разные технологии и фреймворки, то есть риск сильно раздуть его. При дроблении монолита на микросервисы мы вообще стараемся использовать современные подходы, поэтому задумываемся и об использовании TypeScript.
Рефакторинг платежного процесса Я.Денег — пробуждение силы