Юнит-Тест Организация - PullRequest
2 голосов
/ 12 августа 2010

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

[TestClass]
public class BoardTests_SquarePieceFalling
{
    private Engine engine;
    private BackgroundBoard backgroundBoard;
    private PieceBoard pieceBoard;

    private IFallingPieceFactory GetFallingPieceFactory(FallingPiece fallingPieceToReturn)
    {
        var factory = new Mock<IFallingPieceFactory>();
        factory.Setup(f => f.Generate()).Returns(fallingPieceToReturn);
        return factory.Object;
    }

    private void TestInitializer(Color pieceColor, Size boardSize) {
        backgroundBoard = new BackgroundBoard(boardSize);
        pieceBoard = new PieceBoard(boardSize);

        var fallingPiece = new FallingPiece(new SquarePiece(), pieceColor, boardSize.Width);
        var fallingPieceFactory = GetFallingPieceFactory(fallingPiece);
        var currentFallingPiece = new CurrentFallingPiece(fallingPieceFactory);
        var fallingPieceMovementEvaluator = new FallingPieceMovementEvaluator(backgroundBoard, currentFallingPiece, boardSize);

        engine = new Engine(backgroundBoard, pieceBoard, currentFallingPiece, fallingPieceMovementEvaluator);
    }

    ...Unit-Tests are below

    [TestMethod]
    public void When_Square_Hits_The_Ground_Another_One_Starts_Falling_From_The_Top()
    {
        TestInitializer(Color.Red, new Size(2, 7));

        engine.Tick(10);

        ..Asserts..
    }

    ...
}

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

Мои вопросы:

  1. В настоящее время это лучший способ инициализации тестов? Я знаю, что могу использовать аннотацию [TestInitialize], но это не позволяет мне передавать параметры для инициализации полей, которые я хочу использовать, не так ли?

  2. Я собираюсь разделить текущий тестовый класс на 2-3 меньших тестовых класса. Моя текущая идея - создать базовый тестовый класс, в котором находится логика инициализации, а затем заставить все эти новые классы наследовать от него. Единственное отличие, которое я вижу, заключается в том, что в качестве защищенных полей нужно указывать Engine, BackgroundBoard и PieceBoard. Это хорошая идея?

  3. Как вы обычно относитесь к юнит-тестам, которые очень похожи, но обычно имеют как минимум 1 другое поле настройки? Я имею в виду, что во многих моих юнит-тестах у меня одинаковые Engine, BackgroundBoard, PieceBoard, FallingPiece, CurrentFallingPiece, FallingPieceFactory и т. Д., И т. Д., Но обычно один или два вещи разные для каждого теста. Я обошел проблему, определив метод TestInitializer() с параметрами, которые мне нужны в каждом тесте, но мне остается только подумать, есть ли другой способ сделать это.

Спасибо

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Я не вижу проблем с тем, что вы делаете. Вы можете проверить это: http://xunitpatterns.com/Parameterized%20Test.html

1 голос
/ 12 августа 2010

Как правило, лучше всего иметь один тестовый класс (файл) на каждый тестируемый класс.

То есть у вас должно быть EngineTest, BackgroundBoardTest и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...