这个问题有点像 following topic 的延续。 (不过,您不需要阅读它)。这只是我用 TDD 实现的俄罗斯方 block 游戏。
所以问题是:我有一组验收测试。我在其中之一定义了以下测试:
[TestMethod]
public void I_Can_Query_Any_Piece_Of_The_Board_For_A_Color() {
StandardTetris tetris = new StandardTetris();
for (int y = 0; y < tetris.BoardSize.Height; ++y) {
for (int x = 0; x < tetris.BoardSize.Width; ++x) {
Color color = tetris.GetColorAt(x, y);
Assert.IsTrue(
color == Color.Cyan ||
color == Color.Blue ||
color == Color.Orange ||
color == Color.Yellow ||
color == Color.Green ||
color == Color.Violet ||
color == Color.Red
);
}
}
}
这让我改变了 StandardTetris
public Color GetColorAt(int x, int y)
{
return Color.Black;
}
至
public Color GetColorAt(int x, int y)
{
return Color.Orange;
}
我想做的下一个测试是将几个像素设置为某些颜色,然后检查它们是否确实在我放置它们的位置中具有该颜色(尽管,现在我想到了,不会是验收测试)。 我怎样才能做到这一点? StandardTetris 不为棋盘提供任何类型的 setter (不是它应该这样做的!),并且除了默认构造函数之外,我不想有任何其他构造函数。那我该如何 mock 它呢?
<小时 />这是StandardTetris
上的当前代码:
public class StandardTetris
{
private static readonly int BOARD_WIDTH = 10;
private static readonly int BOARD_HEIGHT = 22;
private Size boardSize = new Size(BOARD_WIDTH, BOARD_HEIGHT);
public Size BoardSize { get { return boardSize; } }
public Color GetColorAt(int x, int y)
{
return Color.Orange;
}
}
根据您的建议,我进行了以下测试:
[TestMethod]
public void Set_A_Blue_2x2_Square_On_Origin_And_Query_It_Sucessfully() {
Board board = new Board();
board.SetColorAt(0, 0, Color.Blue);
board.SetColorAt(0, 1, Color.Blue);
board.SetColorAt(1, 0, Color.Blue);
board.SetColorAt(1, 1, Color.Blue);
Tetris tetris = new Tetris(board);
Assert.AreEqual(Color.Blue, tetris.GetColorAt(0, 0));
Assert.AreEqual(Color.Blue, tetris.GetColorAt(1, 0));
Assert.AreEqual(Color.Blue, tetris.GetColorAt(0, 1));
Assert.AreEqual(Color.Blue, tetris.GetColorAt(1, 1));
}
请您参考如下方法:
我看到两个选项:
创建第二个构造函数,您可以在其中传递预先构造的信息。
创建一个继承自
StandardTetris
的测试类TestStandardTetris
,其中唯一的区别是TestStandardTetris
具有用于获取预定义的构造函数。构建的信息。
你的测试告诉你,你需要一种方法来设置状态,并且你说你不希望状态改变,因此缺少 setter ,所以只剩下设置状态的唯一地方是构造函数。
第一个选项将其打开到游戏的主 API。
第二个仅向测试开放,任何 future 使用您的 API 的人如果决定继承 StandardTetris
,它也将允许您测试 StandardTetris 的功能,如果唯一的事情是更改是将构造函数添加到 TestStandardTetris
可能还有其他更好的方法可以做到这一点,所以请等待看看其他人是否能提出更好的答案。 :)