Я пишу юнит-тесты для класса в приложении игры из жизни.У меня есть метод, который создает двумерный массив bools, а затем изменяет ссылку на поле (другой двумерный массив bools) на новый массив.
У меня проблема с модульным тестированием класса.Я пытаюсь проверить правильность вывода, однако я не могу получить доступ к массиву после того, как он изменил ссылку.
Я нашел обходной путь, вместо создания новогомассив и назначая новую ссылку, я зацикливаю повторное заполнение исходного поля содержимым нового массива, но это добавляет ненужные вычисления только ради модульного тестирования, что не похоже на хорошую идею.
Как проверить правильность поведения метода Evolve?
Board.cs
public class Board : IBoard
{
private bool[,] _board;
private int _noRows;
private int _noColumns;
private IConsole _console;
public Board(IConsole console)
{
_console = console;
}
public void Set(bool[,] board)
{
_board = board;
_noRows = board.GetLength(0);
_noColumns = board.GetLength(1);
}
private IEnumerable<bool> GetNeighbours(int boardTileY, int boardTileX)
{
var neighbours = new List<bool>();
for (var i = boardTileY - 1; i <= boardTileY + 1; i++)
{
for (var j = boardTileX - 1; j <= boardTileX + 1; j++)
{
if (i == boardTileY && j == boardTileX)
{
continue;
}
//if neighbour out of bounds add as dead
else if (i >= _noRows || i < 0 || j >= _noColumns || j < 0)
{
neighbours.Add(false);
}
else
{
neighbours.Add(_board[i, j]);
}
}
}
return neighbours;
}
public void Evolve()
{
var boardAfter = new bool[_noRows, _noColumns];
for (var i = 0; i < _noRows; i++)
{
for (var j = 0; j < _noColumns; j++)
{
var aliveCounter = GetNeighbours(i, j).Count(n => n);
switch (_board[i, j])
{
// if dead tile has exactly 3 neighbours that are alive it comes to life
case false when aliveCounter == 3:
boardAfter[i, j] = true;
break;
// if alive tile has 0 or 1 neighbours (is lonely) or more than 3 neighbours (overcrowded) it dies
case true when (aliveCounter < 2 || aliveCounter > 3):
boardAfter[i, j] = false;
break;
default:
boardAfter[i, j] = _board[i, j];
break;
}
}
}
_board = boardAfter;
}
}
BoardTests.cs
[TestFixture]
public class BoardTests
{
private Mock<IConsole> _fakeConsole;
[SetUp]
public void SetUp()
{
_fakeConsole = new Mock<IConsole>();
}
[Test]
public void Evolve_Once_ReturnCorrectOutput()
{
//Arrange
var board = new Board(_fakeConsole.Object);
var boardArray = new[,] {
{false, false, false, false, false},
{false, false, false, false, false},
{false, true , true , true , false},
{false, false, false, false, false},
{false, false, false, false, false}
};
//Act
board.Set(boardArray);
board.Evolve();
//Assert
Assert.That(boardArray[1, 1].Equals(false));
Assert.That(boardArray[1, 2].Equals(true));
Assert.That(boardArray[1, 3].Equals(false));
Assert.That(boardArray[2, 1].Equals(false));
Assert.That(boardArray[2, 2].Equals(true));
Assert.That(boardArray[2, 3].Equals(false));
Assert.That(boardArray[3, 1].Equals(false));
Assert.That(boardArray[3, 2].Equals(true));
Assert.That(boardArray[3, 3].Equals(false));
}
[Test]
public void Evolve_Twice_ReturnCorrectOutput()
{
//Arrange
var board = new Board(_fakeConsole.Object);
var boardArray = new[,] {
{false, false, false, false, false},
{false, false, false, false, false},
{false, true , true , true , false},
{false, false, false, false, false},
{false, false, false, false, false}
};
//Act
board.Set(boardArray);
board.Evolve();
board.Evolve();
//Assert
Assert.That(boardArray[1, 1].Equals(false));
Assert.That(boardArray[1, 2].Equals(false));
Assert.That(boardArray[1, 3].Equals(false));
Assert.That(boardArray[2, 1].Equals(true));
Assert.That(boardArray[2, 2].Equals(true));
Assert.That(boardArray[2, 3].Equals(true));
Assert.That(boardArray[3, 1].Equals(false));
Assert.That(boardArray[3, 2].Equals(false));
Assert.That(boardArray[3, 3].Equals(false));
}
}