在进行TDD并编写单元测试时,如何在编写要测试的“实现”代码的第一次迭代时抵制“作弊”的冲动?
例如:
让我们需要计算一个数字的阶乘。我从一个单元测试开始(使用MSTest),例如:
[TestClass]
public class CalculateFactorialTests
{
[TestMethod]
public void CalculateFactorial_5_input_returns_120()
{
// Arrange
var myMath = new MyMath();
// Act
long output = myMath.CalculateFactorial(5);
// Assert
Assert.AreEqual(120, output);
}
}
我运行此代码,但由于该CalculateFactorial
方法甚至不存在而失败。因此,我现在编写代码的第一次迭代以实现被测方法,并编写通过测试所需的最少 代码。
问题是,我一直很想写以下内容:
public class MyMath
{
public long CalculateFactorial(long input)
{
return 120;
}
}
从技术上讲,这是正确的,因为它确实是“作弊”,因为它实际上甚至没有尝试执行计算阶乘的功能,尽管它确实是进行特定测试通过(变为绿色)所需的最少代码。当然,现在重构部分成为“编写正确的功能”的练习,而不是真正的实现重构。显然,添加具有不同参数的其他测试将失败并强制进行重构,但是您必须从该测试开始。
因此,我的问题是,如何在“编写最少的代码以通过测试”同时又保持其功能与您实际试图实现的精神之间取得平衡?