如何使用 ...spread 获取作为函数参数的函数的 "returns"?
How to get the "returns" of functions that are arguments in a function using ...spread?
我正在为我的单元测试开发一个简单的 Javascript 客户端 API,因为我正在研究 TDD 并通过实践更好地学习。
我遵循的模型在测试中只会是 CHECK,我有我的 TEST 函数,它是给定文件的所有测试都是,每个测试将由 TEST_F 调用,每个测试只有一个 CHECK 函数,因此不需要对每个 TEST_F 进行描述,因为只需一个 CHECK,它简单易懂,只需一个好的 "nameTest".
我遇到的问题是使用 Javascript spread,我其实很清楚没有它如何解决我的问题,但我想了解它是否可以帮助我简化这里的东西。 TEST 函数,正如我所说,可能会得到几个 TEST_F 函数作为参数,所以我想我会做类似 const TEST = (... f) => {};
,但我不确定如何使用每个 "f" 参数,因为每个 TEST_F 函数 returns 我一个对象,我想用来控告失败的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_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);
}
如果您的目标是调用 f
数组中的每个函数并将它们的结果放入 passing
或 failing
数组,我可能会使用简单的 for-of
:
for (const fn of f) {
const result = fn();
result.resultTest==='passed'?passing.push(result):failing.push(result);
}
或forEach
或类似的,任何数组循环机制都可以完成这项工作。
我正在为我的单元测试开发一个简单的 Javascript 客户端 API,因为我正在研究 TDD 并通过实践更好地学习。
我遵循的模型在测试中只会是 CHECK,我有我的 TEST 函数,它是给定文件的所有测试都是,每个测试将由 TEST_F 调用,每个测试只有一个 CHECK 函数,因此不需要对每个 TEST_F 进行描述,因为只需一个 CHECK,它简单易懂,只需一个好的 "nameTest".
我遇到的问题是使用 Javascript spread,我其实很清楚没有它如何解决我的问题,但我想了解它是否可以帮助我简化这里的东西。 TEST 函数,正如我所说,可能会得到几个 TEST_F 函数作为参数,所以我想我会做类似 const TEST = (... f) => {};
,但我不确定如何使用每个 "f" 参数,因为每个 TEST_F 函数 returns 我一个对象,我想用来控告失败的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_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);
}
如果您的目标是调用 f
数组中的每个函数并将它们的结果放入 passing
或 failing
数组,我可能会使用简单的 for-of
:
for (const fn of f) {
const result = fn();
result.resultTest==='passed'?passing.push(result):failing.push(result);
}
或forEach
或类似的,任何数组循环机制都可以完成这项工作。