Это изменится в зависимости от используемой вами модели. С Rhino.Mocks это будет выглядеть так:
var board = MockRepository.GenerateStub<IBoard>();
board.Size = new Size(2,2);
BoardEngine boardEngine = new BoardEngine(board);
board.AssertWasCalled(b => b.SetAllCellsTo(Color.Black),
options => options.Repeat.Times(1));
Здесь вы создаете макет или заглушку, делаете то, что тестируете, а затем утверждаете, что ожидаемая вещь произошла. В этом случае вы ожидаете, что SetAllCellsTo(Color.Black)
будет вызван один раз.
Вас не интересует, все ли ячейки теперь черные, потому что это поведение вне единицы - даже вне тестируемого класса, который в данном случае равен BoardEngine
. Все, что вы тестируете, это то, что BoardEngine
вызывает указанный метод для внедренной зависимости, когда она создается.
редактировать в ответ на OP edit
Два параметра, которые вы наметили при редактировании, верны, но не являются взаимоисключающими. Я рекомендую, чтобы у вас были модульные тесты, чтобы убедиться, что каждый компонент функционирует должным образом при различных начальных условиях, и тестах, которые обеспечивают взаимодействие на более высоком уровне.
Имейте в виду, что вы можете покрыть базы, (1) проверяя, что вызов board.SetAllCellsTo(Color.Black)
действительно работает, независимо от BoardEngine
, и затем (2) проверяя, что BoardEngine
вызывает, что [проверено на работоспособность ] метод. Тем не менее, у вас должны быть высокоуровневые тесты, чтобы убедиться, что все действительно играет вместе, как и ожидалось, без побочных эффектов.
Какой тест для начала немного субъективен. С точки зрения реализации функциональности с помощью TDD вам необходимо иметь четкое представление о том, как вы хотите, чтобы система работала - как BoardEngine
и Board
будут работать вместе. Вы можете определить оба интерфейса и наметить тест, но вы не сможете выполнить тест до тех пор, пока не реализуете оба интерфейса, и если вы напишете тест, вы не сможете его скомпилировать, потому что у вас не будет классов для экземпляр. С другой стороны, вы можете написать модульные тесты при реализации каждого интерфейса. Начните с IBoard
, потому что у него меньше зависимостей. Начните внедрять Board : IBoard
и покройте это, как вы идете. Если вы знаете, что вызов SetAllColorsTo()
работает должным образом, вам будет удобнее с модульным тестом конструктора BoardEngine
, вызывающего этот метод.