首页 > 解决方案 > 仅返回 1 个值时如何使此 removeMiddle 测试通过

问题描述

我正在尝试创建一个函数以使此测试通过

这是我的测试用例的以下代码:

var removeMiddle = require("./remove-middle");

test("Remove middle", function () {
  var words = ["mouse", "giraffe", "queen", "window", "bottle"];

  var expectedWords = ["mouse", "giraffe", "window", "bottle"];
  var expectedOutput = ["queen"];

  var output = removeMiddle(words);

  expect(output).toEqual(expectedOutput);
  expect(words).toEqual(expectedWords);
});

这是我创建的函数:

function removeMiddle(words) {
  let index = [];
  words.splice(2, 1);
  for (let i = 0; i < words.length; i++) {
    if (words[i] === "queen") {
      index.push(words[i]);
    }
  }

  return words;
}

module.exports = removeMiddle;

现在我的函数刚刚通过了第二个测试用例:expect(words).toEqual(expectedWords);

标签: javascriptunit-testingtestingtdd

解决方案


首先,您希望您的输出是删除的单词。但是您words要从removeWords. 您可能可以返回index

此外,一旦你拼接了你的words数组,queen将不再是数组的一部分。所以你的 for 循环什么都不做, index 返回一个空数组。

您可以像这样修改代码以获得预期的输出:

function removeMiddle(words) {
  let index = [words[2]];
  words.splice(2, 1);
  return index;
}

但是现在您的代码有点硬编码,仅适用于固定长度的数组(5)。如果您想要更通用的解决方案,可以执行以下操作。

function removeMiddle(words) {
 if(words.length == 0) return [];
  let index = [];
  let middleElements = [];
  if(words.length % 2 == 0){
   console.log(words[Math.floor(words.length/2)]);
    middleElements.push(words[Math.floor(words.length/2)]);
    words.splice(words.length/2,1);
   console.log(words[Math.floor(words.length/2)]);
    middleElements.push(words[Math.floor(words.length/2)]);
    words.splice(words.length/2,1);  
  }
  else{
   console.log(words.length/2);
    middleElements.push(words[Math.floor(words.length/2)]);
    words.splice(words.length/2,1);  
  }
  return middleElements;
}

推荐阅读