那些年我不知道的TDD(一)
|
TDD
今儿接到一需求如下: 今天我要完成这个游戏的核心功能(猜测数字),我称它为Guesser。传入一个数字,返回一个结果。分析一下它可能输出的几种情况:4a0b(全对)、 0a4b(数字全对,位置全错)、2a2b(一半一半)、0a0b(全错)。这4个CASE应该Cover了所有情况了。如果有补充,请Follow。 今天的TO-DO-LIST: 假设我们这局游戏的答案是2975。 输入“2975” 输出4a0b。 输入“2957” 输出2a2b。 输入“9257” 输出0a4b。 输入“1348” 输出0a0b。 完成Guesser类.新建一个TEST 写测试。 开始第一个CASE:输入2975 与答案正匹配,输出4a0b 。 [TestMethod]
public void Test1()
{
var inputNumber = "2975";
var actual = new Guesser().Guess(inputNumber);
Assert.AreEqual("4a0b",actual);
}
这个测试方法的命名一眼好像看不出它要测什么。单独看测试的名字很是迷茫。我们修改一下让它看起来很整洁。一眼看上去就知道是啥意思。要测试什么。 [TestMethod]
public void should_return_4a0b_when_input_numbers_all_figures_and_positions_are_right()
{
var inputNumber = "2975";
var actual = new Guesser().Guess(inputNumber);
Assert.AreEqual("4a0b",actual);
}
修改完之后在看这个方法的命名。 是不是清晰了很多。看到方法的命名应该就能够猜测到此方法是在什么情况下测试什么功能。 OK。我们的第一个CASE搞定了。Run一下。 编译不通过!因为没有Guesser类。没有Guess方法。 为了让CASE过。我们必须创建Guesser类以及Guess方法。 public class Guesser
{
public string Guess(string inputNumber)
{
throw new System.NotImplementedException();
}
}
现在编译没错误了。在Run。 有异常:System.NotImplementedException: The method or operation is not implemented. 闹心。为了不闹心。Guess方法里简单实现。最简单的就是直接返回"4a0b"。这里还是简单的实现实现。 public class Guesser
{
private const string AnswerNumber = "2975";
public string Guess(string inputNumber)
{
var ACount = 0;
var BCount = 0;
for (var index = 0; index < AnswerNumber.Length; index++)
{
if (AnswerNumber[index]==inputNumber[index])
{
ACount++;
}
}
return string.Format("{0}a{1}b",ACount,BCount);
}
}
OK。但是我们内部实现如此简单。不知道是否满足第二个CASE呢。 完成一个CASE要把它划掉。 To-Do-List: 输入“2975” 输出4a0b。 输入“1348” 输出0a0b。 完成Guesser类. 来第二个CASE:输入9257与答案不匹配,但是所有数字都正确,输出0a4b 。 有了第一个CASE的经验,这里我们也同样注意命名。 [TestMethod]
public void should_return_2a2b_when_input_numbers_all_figures_right_and_2_positions_right()
{
var inputNumber = "2957";
var actual = new Guesser().Guess(inputNumber);
Assert.AreEqual("2a2b",sans-serif; font-size:14px; line-height:21px"> Run.....
|
