我有一個名爲ExcelManager的類,負責在其構造函數中創建一個Excel文件的路徑,並具有一個方法一個工作表名稱作爲一個字符串或工作表索引作爲一個整數,然後它分析該工作表上的數據減去標題並構建並返回一個DataTable。需要對依賴於Office.Interop(COM)類的自定義類運行單元測試
我已經編寫了成功測試大部分ExcelManager類的集成測試,但它們只能在安裝了Excel的系統上運行。
我想要做的是要分解ExcelManager類,以便我可以嘲笑電子表格和測試,而不需要Excel或找到一種方法來單元測試和可能注入模擬對象用於測試目的(我不知道這是更好的做法),但我真的不能明白的方式來做到這一點,這裏是一些Excel的經理代碼:
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
還有另一種方法,它爲表格提供字符串名稱並用表格索引調用這個名稱。
感謝您的輸入,我能夠做一些重構,打破ExcelManager全班學生分成兩個班(ParseDataArray和ExcelManager)現在我很舒服離開ExcelManager代碼未經測試。我將發佈有關新問題的另一個問題。 – Justin 2011-04-06 20:05:37