Цель DI - не избегать создания экземпляров. Даже DI-контейнер должен каким-то образом создавать экземпляры ваших зависимостей, например, с помощью отражения.
Вместо этого DI составляет примерно , где для создания этих экземпляров. Сказав это, вы не должны позволять вашей тестируемой системе (SuT, в вашем случае класс ExcelInit
) создавать свои собственные зависимости, а просто вводить их в систему, например, с помощью инжектора-конструктора или простодобавив в метод paremeter:
public void BeginProcess(DataReader dr, CellLocation cl, DataHandler dh)
{
//Gets the corresponding cellAddress for the cell that contains "2x5" from our hidden config-sheet
var correspondingCellsAddress = cl.FindCorrespondingCellAddress(_model.boxSize);
//returns the range that we need to copy i.e. the whole range of the box ala B3:AG13
var srcRange = dr.GetRangeForSourceDestination(correspondingCellsAddress);
//Last row of sheet 6 (the sheet we populate) with input-boxes
var lastRow = dr.FindLastRowByName("Your_Data_Sheet") + 3;
//gets the cell we'll copy our range to
var destRange = "B" + lastRow.ToString();
dh.CopyBox(srcRange, destRange, _model);
}
Теперь в вашем тесте у вас есть это:
var target = new ExcelInit();
target.BeginProcess(new DataReader(), new CellLocation(), new DataHandler());
Конечно, это выполнит точно такие же инструкции. Однако теперь вы также можете сделать это:
var target = new ExcelInit();
target.BeginProcess(new SomeSpecificDataReader(), new CellLocation(), new DataHandler());
Поскольку вы просто вводите читатель вместо того, чтобы создавать его в своем SuT, ваш фактический SuT вообще не меняется. Таким образом, на самом деле тестируемая система не зависит от конкретного файла , а вместо этого зависит от данных . Где хранятся эти данные, не должно иметь никакого значения для вашего BeginProcess
-метода. Например, вы можете предоставить другой файл Excel (при условии, что ваша система использует файлы Excel), файл XML или даже какое-то хранилище данных в памяти.