Как получить «возврат» функций, которые являются аргументами в функции, использующей ... распространение? - PullRequest
0 голосов
/ 11 сентября 2018

Я разрабатываю простой Javascript Client API для своих модульных тестов, так как я изучаю TDD и учусь лучше, делая что-то.

Я слежу за моделью, где по тестам они будут CHECK , у меня есть функция TEST , в которой будут проходить все тесты данного файла, и каждый тест будет вызываться TEST_F только с одной CHECK функцией каждый, таким образом, не нужно описание для каждого TEST_F , поскольку только с CHECK , это просто и легко понять с помощью хорошего "nameTest".

Проблема, с которой я сталкиваюсь, заключается в использовании Javascript распространения , я действительно хорошо знаю, как решить мою проблему без нее, но я хотел бы понять, может ли это помочь мне упростить ситуацию здесь. Как я уже сказал, функция TEST может получить несколько TEST_F функций в качестве аргументов, поэтому я подумал, что я сделаю что-то вроде const TEST = (... f) => {};, но я не уверен, как использовать каждый аргумент "f", поскольку каждая функция TEST_F возвращает мне объект, который я хочу использовать, чтобы обвинить TEST_Fs в сбое. Я попытаюсь объяснить, что я пытаюсь сделать с помощью приведенного ниже кода, который, как мы знаем, не сработает, а только для того, чтобы понять, где я пытаюсь получить:

/* --------------------------------------------------------------- */
/* ------------------- Test API ---------------------------------- */
/* --------------------------------------------------------------- */

const TEST = (fileName, ...f) => {
    const passing = [];
    const failing = [];
    console.log('Running unit tests in '+fileName+':');

    const tStart = performance.now();

    const result = ...f(); // I know it's not possible, but you understand what I'm trying to do?
    result.resultTest==='passed'?passing.push(result):failing.push(result);

    const tEnd = performance.now();
    const duration = tEnd - tStart;

    const lenPassing = passing.length;
    const lenFailing = failing.length;
    console.log('Passing: '+lenPassing+' ('+duration+'ms)');
    console.log('Failing: '+lenFailing);

    if(lenFailing > 0){
        let stg = '';
        for(let i = 0; i < lenFailing; i++){
           stg += (i + ') ' + failing[i].nameTest + ' (' + failing[i].durationTest + ')' + '\n');
        }
        console.log(stg);
    }
};

const TEST_F = (nameTest, f) => {
    const tStart = performance.now();
    const resultTest = f();
    const tEnd = performance.now();
    const durationTest = tEnd - tStart;
    return { nameTest: nameTest, durationTest: durationTest, resultTest: resultTest }; 
};

const CHECK_EQUAL = (value, expected) => {
    return ((value === expected)?'passed':'failed');
};

export {
    TEST,
    TEST_F,
    CHECK_EQUAL
};

Up 1:

Как бы я решил мою проблему, не используя спред? создание TEST объекта, который содержит массив TEST_F , а затем создаст функцию для запуска тестов, что-то вроде EXECUTE_TEST , но я хочу избежать При необходимости вызывать функцию всегда в моих тестовых файлах, я хочу что-то простое, например:

TEST("main.js",
    TEST_F("test1", () => {
        return CHECK_EQUAL(3, 3);
    }),
    TEST_F("test2", () => {
        return CHECK_EQUAL(7, 3);
    })

);

, который мне удалось решить с помощью ответа @TJ Crowder:

 for(let fn of f) {
        const result = fn;
        result.resultTest==='passed'?passing.push(result):failing.push(result);
    }

1 Ответ

0 голосов
/ 11 сентября 2018

Если ваша цель - вызывать каждую функцию в массиве f и получать результаты от них в массивы passing или failing, я бы, вероятно, использовал простое for-of:

for (const fn of f) {
    const result = fn();
    result.resultTest==='passed'?passing.push(result):failing.push(result);
}

или forEach или подобное, любой из механизмов зацикливания массива сделает эту работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...