如何使用... spread获得作为函数参数的函数的“返回”?

时间:2018-09-11 15:48:50

标签: javascript unit-testing ecmascript-6 tdd

我正在开发用于单元测试的简单Javascript Client API,因为我正在研究TDD并通过做事更好地学习。

我正在按照一个模型进行测试,它们将仅通过测试检查,我具有我的 TEST 功能,在该功能中,给定文件的所有测试将是,并且每个测试将由 TEST_F 调用,每个测试仅具有一个 CHECK 函数,因此不需要为每个 TEST_F 进行描述,因为只需 CHECK (检查),只需简单的“ nameTest”即可轻松理解。

我遇到的问题是使用Javascript spread,实际上我很清楚如果没有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
};
  

上1:

在不使用价差的情况下如何解决我的问题?创建一个包含数组 TEST_F TEST 对象,然后创建一个函数来运行测试,类似于 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 :(得分:1)

如果您的目标是调用f数组中的每个函数并将结果从它们中提取到passingfailing数组中,那么我可能会使用简单的{{1 }}:

for-of

for (const fn of f) { const result = fn(); result.resultTest==='passed'?passing.push(result):failing.push(result); } 或类似,任何数组循环机制都可以完成。