У меня есть класс с именем ExcelManager, который отвечает за определение пути к файлу Excel в своем конструкторе и имеет метод, который принимает имя листа в виде строки или индекс листа в виде целого числа, а затем анализирует данные на этом листе. минус заголовки, строит и возвращает DataTable.
Я написал интеграционные тесты, которые успешно тестируют большую часть класса ExcelManager, однако они могут работать только в системе, в которой установлен Excel.
То, что я хочу сделать, это либо сломать класс ExcelManager, чтобы я мог смоделировать электронную таблицу и тестировать без необходимости в Excel, либо найти способ для модульного тестирования и возможного внедрения поддельного объекта в целях тестирования (я не конечно, это лучшая практика), но я не могу найти способ сделать это, вот часть кода Excel Manager:
public ExcelManager(string FilePath)
{
try
{
application = new ApplicationClass();
}
catch (Exception)
{
throw new Exception("This feature requires a version of Microsoft Excel developed in 2002 or later, which is not detected on your computer.");
}
application.Visible = false;
application.ScreenUpdating = false;
application.DisplayAlerts = false;
this.FilePath = FilePath;
workbook = application.Workbooks.Open(FilePath, false, false, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss, miss);
}
Это метод, который открывает указанный лист и создает DataTable
Строки headerRng используются для ограничения выбора данными, введенными пользователем, в электронной таблице есть несколько постоянных полей, которые не нужно считывать.
public DataTable GetRangeValue(int SheetIndex)
{
worksheet = (Worksheet)workbook.Sheets[SheetIndex];
var headerRng = worksheet.get_Range("A1", miss);
headerRng = headerRng.get_End(XlDirection.xlToRight);
headerRng = worksheet.get_Range("A1", headerRng);
var headerData = (object[,])headerRng.Value2;
var columnCount = headerData.GetLength(1);
var last = worksheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing);
var dataRng = worksheet.get_Range("A2", last);
var sheetData = (object[,])dataRng.Value2; // the rest of the code is the DataTable processing
Есть еще один метод, который берет строковое имя для листа и вызывает его с индексом листа.