首页 > 解决方案 > 如何使用 ...spread 获取作为函数中参数的函数的“返回”?

问题描述

我正在为我的单元测试开发一个简单的 Javascript 客户端 API,因为我正在研究 TDD 并通过做事更好地学习。

我正在遵循一个模型,在该模型中它们只能通过测试进行检查,我有我的TEST函数,这是给定文件的所有测试的地方,并且每个测试都将由TEST_F调用,每个测试只有一个CHECK函数,因此不需要对每个TEST_F进行描述,因为只需一个CHECK,只需一个好的“nameTest”就可以简单易懂地理解。

我遇到的问题是使用 Javascript spread,我实际上很清楚如何在没有它的情况下解决我的问题,但我想了解它是否可以帮助我简化这里的事情。正如我所说,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);
    }

标签: javascriptunit-testingecmascript-6tdd

解决方案


如果您的目标是调用f数组中的每个函数并将它们的结果放入passingorfailing数组中,我可能会使用一个简单的for-of

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

forEach类似的,任何数组循环机制都可以完成这项工作。


推荐阅读