【发布时间】:2010-07-25 07:51:19
【问题描述】:
所以我对即将诞生的 Board 类进行了以下测试:
[TestMethod]
public void Set_The_Origin_As_Violet_And_The_Query_Confirms_It() {
Board board = new Board(10, 10);
Color expected = Color.Violet;
board.SetColorAt(0, 0, expected);
Color actual = board.GetColorAt(0, 0);
Assert.AreEqual(expected, actual);
}
我尝试运行代码,但编译器提示Board 不存在。所以我创建了它。
我尝试再次运行代码,但无济于事,因为 SetColorAt() 和 GetColorAt() 方法都不存在。我创建了它们:
public void SetColorAt(int x, int y, Color color) {
}
public void GetColorAt(int x, int y) {
}
不过,并非一切都很好,因为我必须返回 Color.Violet。所以我将 GetColorAt() 更改为
public void GetColorAt(int x, int y) {
return Color.Violet;
}
所以我第一次得到了绿灯。
我希望我的最终代码出现在课堂板上是以下形式:
public class Board
{
private Color[,] board;
public Board(int x, int y)
{
board = new Color[x, y];
}
public void SetColorAt(int x, int y, Color color) {
board[x, y] = color;
}
public Color GetColorAt(int x, int y) {
return board[x, y];
}
}
我的第一个问题是......
如何到达那里?我是否可以考虑在上面显示的单元测试的“重构”阶段,删除重复时我最终会得到这段代码?
如果答案是肯定的,我觉得我的单元测试正在测试一些过于“本地化”的东西,而不是代码的实际作用。你看,测试只是检查 1 个像素和一种颜色,而代码本身要复杂得多。
也许解决方案是添加更多单元测试?你会建议做哪个?
我的第二个问题是……
我知道以后我会想要一个IBoard。我应该在上面的单元测试中表达吗?我应该让
Board board = new Board(10, 10);
照原样创建IBoard 接口?如何处理?
【问题讨论】:
-
问题是你从“这是正确的解决方案”开始。 TDD 是一种指导您进行良好设计的技术,而不是预先确定的设计。
-
好吧,我明白你的意思了。但我无法想象除此之外的任何其他解决方案。您有一组 (x, y) 点,并且您希望将它们存储在二维数组中。这是实现这一目标的最简单方法。
-
:) - 就像我说的......你已经决定了你想要最终结果是什么......你需要写“最简单的想法”,然后重构以删除重复。
-
@Oded 我认为你的意思是“最简单的工作”:)
-
@Sekhat - 确实如此。我责怪我的胖手指。
标签: c# java unit-testing tdd