В настоящее время я использую следующий бит кода для инициализации некоторых модульных тестов в классе:
[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..
}
...
}
Теперь, мне кажется, у меня слишком много методов тестирования для этого класса. Я также считаю, что они занимают много места, поэтому я хотел бы разделить их на более мелкие тестовые классы.
Мои вопросы:
В настоящее время это лучший способ инициализации тестов? Я знаю, что могу использовать аннотацию [TestInitialize], но это не позволяет мне передавать параметры для инициализации полей, которые я хочу использовать, не так ли?
Я собираюсь разделить текущий тестовый класс на 2-3 меньших тестовых класса. Моя текущая идея - создать базовый тестовый класс, в котором находится логика инициализации, а затем заставить все эти новые классы наследовать от него. Единственное отличие, которое я вижу, заключается в том, что в качестве защищенных полей нужно указывать Engine
, BackgroundBoard
и PieceBoard
. Это хорошая идея?
Как вы обычно относитесь к юнит-тестам, которые очень похожи, но обычно имеют как минимум 1 другое поле настройки? Я имею в виду, что во многих моих юнит-тестах у меня одинаковые Engine
, BackgroundBoard
, PieceBoard
, FallingPiece
, CurrentFallingPiece
, FallingPieceFactory
и т. Д., И т. Д., Но обычно один или два вещи разные для каждого теста. Я обошел проблему, определив метод TestInitializer()
с параметрами, которые мне нужны в каждом тесте, но мне остается только подумать, есть ли другой способ сделать это.
Спасибо