2011-04-04 45 views
0

我有一個名爲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 

還有另一種方法,它爲表格提供字符串名稱並用表格索引調用這個名稱。

回答

0

最好的辦法是將應用程序對象傳遞到ExcelManager類的構造函數中。

這將允許您使用一個模擬框架來創建一個假的版本的excel,將它傳遞到您的單元測試中的類中。

不利的一面是模擬對象的設置最終知道你的管理器類的內部行爲,這真的是行爲測試而不是黑盒測試,並且可能是重構時的一種痛苦(一種脆弱的測試代碼異味)

不太理想,但是在我發現的單元測試中,com-interop有點弱點。

有一個有趣的文章證明這樣的做法here

+0

感謝您的輸入,我能夠做一些重構,打破ExcelManager全班學生分成兩個班(ParseDataArray和ExcelManager)現在我很舒服離開ExcelManager代碼未經測試。我將發佈有關新問題的另一個問題。 – Justin 2011-04-06 20:05:37

相關問題