Я разрабатываю простой 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);
}