Как проверить классы фасада без конструкторов args и сеттеров с TDD? - PullRequest
0 голосов
/ 25 июля 2010

Этот вопрос является продолжением следующей темы (хотя вам и не нужно ее читать). Это просто игра в тетрис, которую я реализую с помощью TDD.

Так вот в чем проблема: у меня есть набор приемочных тестов. Я определил следующий тест в одном из них:

[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 не предоставляет какого-либо установщика для частей платы (не предполагается, что он должен это делать!), И я не хочу иметь никакого другого конструктора, кроме конструктора по умолчанию. Как я могу тогда издеваться?


Это текущий код на 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));
    }

Ответы [ 3 ]

1 голос
/ 25 июля 2010

Пиксели кажутся мне очень низким уровнем. Если мы говорим о фигурах на доске, я ожидаю проверить, что на доске есть фигура в определенной позиции сетки. Поскольку мы имеем дело с доской, я написал бы тесты против нее, поэтому я бы сделал следующее для доски:

1) Проверьте, что на доске в определенной позиции есть форма, например, (TShape относится к той форме Т в тетрисе, надеюсь, это понятно;))

  public void TestHasTShapeAtCoordinates()
    Assert.isEqual(board.shapeAt(1,2), TShape.new)
  end

2) Проверьте, что я могу расположить форму

1 голос
/ 25 июля 2010

вижу два варианта:

  • Создайте второй конструктор, в который вы можете передать предварительно созданную информацию.

  • Создайте тестовый класс TestStandardTetris, который наследуется от StandardTetris, где единственное отличие состоит в том, что TestStandardTetris имеет конструктор для получения предварительно созданной информации.

Ваши тесты говорят вам, что вам нужен способ установить состояние, и вы говорите, что не хотите, чтобы состояние менялось, отсюда и отсутствие установщика, поэтому единственное место, где можно установить состояние это конструктор.

Первый вариант открывает его для основного API игры.

Второй открывает его только для тестов, и любой будущий человек, работающий с вашим API, который решит унаследовать от StandardTetris, также позволит вам протестировать функциональность StandardTetris, если единственное, что изменилось, это добавление конструктора до TestStandardTetris

Вероятно, есть другие и более эффективные способы сделать это, поэтому подождите, чтобы узнать, придет ли кто-нибудь еще с лучшим ответом. :)

0 голосов
/ 25 июля 2010

Я бы использовал библиотеку IoC для вставки экземпляра Board в экземпляр StandardTetris через конструктор. Затем в тестовых методах вы можете вручную создать экземпляр StandardTetris с макетом доски, который будет возвращать все, что вам нравится.

public class StandardTetris
{
  IBoard _theBoard;
  public StandardTetris(IBoard boardInstance)
  {
    _theBoard = boardInstance;
  }
}

Тогда в методах испытаний:

StandardTetris tetris = new StandardTetris(new MockBoard());

В коде времени выполнения вы просто передали бы это библиотеке IoC после регистрации интерфейса IBoard как разрешения класса платы времени выполнения .:

StandardTestris tetris = new IoCContainer.Resolve<StandardTetris>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...