У меня есть куча тестов, которые предполагают, что мой класс Tetris
составлен из класса Board
.Теперь я чувствую, что вместо того, чтобы иметь Board
внутри этого Tetris
класса, я хочу иметь Board
внутри BoardEngine
класса, который находится внутри Tetris
класса.Вот что просит этот тест:
[TestMethod]
public void Start_Game_And_Check_That_A_Red_Cube_Appears_And_Moves_Down_One_Pixel_On_First_Iteration() {
Board board = new Board(10, 22);
BoardEngine boardEngine = new BoardEngine(board);
Tetris tetris = new Tetris(boardEngine);
//test that the pixels are black/empty at first
Assert.AreNotEqual(Color.Red, tetris.GetColorAt(0, 0));
Assert.AreNotEqual(Color.Red, tetris.GetColorAt(1, 0));
tetris.Start();
//and that after running Start() the pixels are set to red
Assert.AreEqual(Color.Red, tetris.GetColorAt(0, 0));
Assert.AreEqual(Color.Red, tetris.GetColorAt(1, 0));
}
Итак, чтобы запустить этот код, мне сначала нужно было создать класс BoardEngine
.После этого мне нужен пустой конструктор BoardEngine
, который принимает Board
в качестве аргумента.Затем мне нужно создать пустой новый конструктор на Tetris
, который принимает BoardEngine
в качестве аргумента.
Если я попытаюсь запустить код, я получу NullPointerException
.Зачем?Потому что при попытке сделать
tetris.GetColorAt(0, 0)
, поскольку в этом конструкторе, который я использую сейчас, я не установил Board
в Tetris
для чего-либо, он просто взорвется.
Мой первый вопрос возникает здесь.Что делать сейчас?С одной стороны, я могу сделать так, чтобы это не вылетало, установив что-то на Board
.С другой стороны, что я действительно хочу, так это не устанавливать что-либо, я хочу в конечном итоге избавиться от него, поэтому мой класс Tetris
имеет только атрибут BoardEngine
.
Должен ли я пойти и провести рефакторинг самих тестов?Я думаю, что это единственный способ сделать эту работу.Я что-то пропустил?В какое время я должен провести рефакторинг других тестов?Если я проведу рефакторинг, прежде чем пытаться запустить этот тест, я смогу сохранить все остальные тесты зелеными, а этот - красным.С другой стороны, если я попытаюсь сделать это как можно скорее зеленым, все остальные станут красными: (
Вот пример старого теста:
[TestMethod]
public void ...() {
Board board = new Board(10, 22);
Tetris tetris = new Tetris(board);
tetris.Start();
Assert.AreEqual(Color.Red, board.GetColorAt(0, 0));
Assert.AreEqual(Color.Red, board.GetColorAt(1, 0));
}
Спасибо