这个问题有点像 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

可能还有其他更好的方法可以做到这一点,所以请等待看看其他人是否能提出更好的答案。 :)


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!