TDD
  今儿接到一需求如下:
  比如一个给定的数字2975,让你去猜。6次机会。如果第一次输入2509,系统会提示 1A2B:其中数字“2”位置猜对&&数字也猜对。称为1A,而“9”和“5”数字猜对了但是位置没有猜对。称为2B。。如果输入2975那么是4个数字都猜对了并且位置也是对的系统提示4A0B。民间俗称猜数字游戏:百度百科传送门:http://baike.baidu.com/view/358630.htm。
  做个简单分析。客户端输入一个数字,经过游戏内部的猜测,返回一个结果给客户端。嗯,还好,不算难。由于准备做TDD实践。所以我们Test First.Why? 如果您对TDD不是很了解。跟我一起做下去,显然我也是新手。我们的目标是“没有蛀牙!”。
  准备工作:VS任意一个版本(C#)、任意一款测试工具、纸、笔(真彩0.5的)。
  第一步:笔和纸拿出来。思考思考如何把这个小游戏拆分了。然后我们一步一步去完成它。写一个To-Do-List。
  To-Do-List:
  猜测数字
  输入验证
  生成答案
  输入次数
  输出猜测结果
  ...............
  暂时想起这么多。比如还有选择游戏难度、输入日志、重新开始游戏、中途退出等等。
  我要完成这个游戏的核心功能(猜测数字),我称它为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一下。