Например, возьмем следующий класс:
class GameBoard
{
public double Evaluate(PieceType cpusPieceType)
{
...
for (var i = 0; i < _tableRepository.Size; ++i)
for (var j = 0; j < _tableRepository.Size; ++j)
if (_tableRepository [i, j] != PieceType.Empty)
{
var isMax = _tableRepository [i, j] == cpusPieceType;
var value = EvaluatePosition (i, j, _tableRepository [i, j]);
...
}
...
}
protected virtual double EvaluatePosition (int row, int column, PieceType pieceType)
{ ... }
}
Я хотел бы написать тест для функции Evaluate, но это, в свою очередь, зависит от значений, возвращаемых функцией EvaluatePosition, которая объявлена защищенной.Теперь моя идея заключалась в том, что я мог бы использовать такой класс:
class XGameBoard : GameBoard
{
protected override double EvaluatePosition (int row, int column, PieceType pieceType)
{
// this will call EvaluatePosition_ShouldReturn which will be mocked and have a value previously set up
return EvaluatePosition_ShouldReturn (row, column, pieceType);
}
public virtual double EvaluatePosition_ShouldReturn (int row, int column, PieceType pieceType)
{
return base.EvaluatePosition (row, column, pieceType);
}
}
Тест будет выглядеть так:
_gameBoardMock = new Mock<XGameBoard>(...);
for (var i = 4; i < _size - 4; i += 2)
for (var j = 4; j < _size - 4; j += 2)
_gameBoardMock.Setup (x => x.EvaluatePosition_ShouldReturn (i, j, PieceType.Cross)).Returns (1.0);
var result = _gameBoardMock.Object.Evaluate (PieceType.Cross);
Проблема в том, что EvaluatePosition внутри функции Evaluate всегда возвращает 0и не вызывается переопределенная функция, которая должна возвращать значение, которое было установлено.
Заранее спасибо.