我在Code Wars中遇到了一个非常基本的挑战。挑战在于测试驱动一个返回正方形数组之和的方法。
到目前为止,我的测试是:
describe "square method" do
it "should return the square of a number" do
Test.assert_equals(squareSum(4), [16])
end
it "should return the square of multiple numbers" do
Test.assert_equals(squareSum(4, 2, 3), [16, 4, 9])
end
end
我的代码是:
def squareSum(*numbers)
numbers.map { |num| num ** 2 }
end
现在我正处于需要更改它的位置,以便增加总和。在我看来,这必然会否定之前的两个测试。至于TDD最佳实践,我是否对前两个场景进行了荒谬的测试,因为它们不是我想要的方法吗?我该如何进行下一次测试?
我应该:
在解决这个问题时,我应该不担心前两个测试吗?我在解决这个问题时遇到了相当大的困难。基本上,我知道我最终想要的是:
describe "squareSum method" do
it "should return the sum of the squares of the numbers passed" do
Test.assert_equals(squareSum(1, 2, 2), 9)
end
end
使用代码使其工作。我只是想知道测试驱动这种特殊问题的最佳实践是什么,因为我想测试我可以在返回总和之前返回多个数字的正方形。我的“最终”代码将使初始测试过时。这是一个“我应该在最终的解决方案中出现多少工作?”,我认为,这是一种挑剔的肛门保留问题。但我很好奇。
答案 0 :(得分:1)
由于测试是您打算编写的软件的规范,因此问题是您为不想要的东西编写规范的原因(因为挑战的任务不是编写一个使其参数正方形的函数)? / p>
你应该首先为“一个返回正方形数组之和的方法”编写一个规范。这个测试开始是红色的。
然后你可能决定需要一个将其参数(或给定数组的元素)作为中间步骤的函数。为此功能编写测试。通过实现这样的功能使其变为绿色。
最终将所有内容放在一起并使初始测试变为绿色(主函数可以使用辅助函数并总结其返回值)。
不,你可以重构。如果在重构期间您决定不再需要辅助函数:删除该函数并删除其测试。
此外,当您的规格发生变化时,您需要重写测试,编写新测试甚至删除其中一些测试。
但一般规则是:测试始终是软件当前状态的规范。他们应该准确指定您的软件的目的。没什么,没什么。