Pull to refresh

Comments 8

С учетом объемов работы это означало написать процесс заново.

Я так и не понял, вы всё-таки переписали весь сервис с нуля, или просто сделали большой рефакторинг с использованием idef-0?
Переписали процесс платежа с нуля, но процесс платежа это только часть сервиса Яндекс.Деньги
Вот посмотрел на код. Он понятен, все такое. НО! А тестить пробовали? Код, который не возвращает явного результата своей работы — читай имеет возвращаемый тип void checkUserPhone. Можно было бы вернуть инстанс измененного ProcessFlow. А так нам нужно дополнительно мочить используемые сущности. Грязные фукнции — зло.

Динамические 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, там где он нужен. Что вы имели в виду под глобальным объектом?

Здравствуйте, когда поправите плагин для opencart 2.3? Написал вам в github неделю назад никакого ответа. https://github.com/yandex-money/yandex-money-cms-opencart2/issues/106

Скорее всего что-то пошло не по плану в процессе установки модуля. Поможем разобраться, напишите на cms@yamoney.ru.

UFO just landed and posted this here

На TypeScript мы переодически смотрим — например, сейчас есть большой монолитный проект. Если активно добавлять туда разные технологии и фреймворки, то есть риск сильно раздуть его. При дроблении монолита на микросервисы мы вообще стараемся использовать современные подходы, поэтому задумываемся и об использовании TypeScript.

Sign up to leave a comment.