2016-07-27 11 views
1

私はここで説明するプロセスを使用したい:Automated Testing OpenXML SDK は(もここで触れた:Unit testing an application that talks to microsoft word via OpenXML)をモッキングのOpenXML SDK SpreadsheetDocument

をしかし、何それはこのような何かを模擬するために時間がかかりますか?私はこのようなものになりますあざける想像

public interface IExcelDocument 
{ 
    Row GetRow(uint rowIndex, SheetData sheetData); 
    SharedStringTablePart GetSharedStringTablePart(SpreadsheetDocument excelDoc); 
    WorksheetPart GetWorksheetPart(SpreadsheetDocument excelDoc, string sheetName); 
    Cell InsertCellInWorksheet(string columnName, uint rowIndex, WorksheetPart worksheetPart); 
    Row InsertRow(WorksheetPart worksheetPart); 
    int InsertSharedStringItem(string text, SharedStringTablePart shareStringPart); 
} 

: 私は、次のインターフェイス作った

[TestMethod()] 
public void Excel_GetWorkseetPartTest() 
{ 
    Mock<IExcelDocument> mockExcelDocument = new Mock<IExcelDocument>(); 
    string sheetName = "sheet"; 
    var excelMock = mockExcelDocument.Object.GetWorksheetPart(MySpreadsheetDocument, sheetName); 

    Assert.IsTrue(excelMock != null); 
} 

GetWorksheetPart方法私はユニットテストしたいとのインタフェースを実装するクラスに常駐IExcelDocument次のようになります。

public WorksheetPart GetWorksheetPart(SpreadsheetDocument excelDoc, string sheetName) 
{ 
    Sheet sheet = excelDoc.WorkbookPart.Workbook.Descendants<Sheet>() 
     .SingleOrDefault(s => s.Name == sheetName); 
    if (sheet == null) 
    { 
     throw new ArgumentException(
      String.Format("No sheet named {0} found in spreadsheet {1}", 
       sheetName, _filePath), "sheetName"); 
    } 
    return (WorksheetPart)excelDoc.WorkbookPart.GetPartById(sheet.Id); 
} 

私はので、周りMySpreadsheetDocumentをラップすることはできませんよSpreadsheetDocument.Openメソッドを実装する必要があり、それが妥当であるかどうかはわかりません。

using (SpreadsheetDocument _excelDoc = SpreadsheetDocument.Open(_filePath, true)) 
{ 
    IExcelDocument excelDoc = new ExcelDocument(); 
    WorksheetPart worksheetPart = excelDoc.GetWorksheetPart(_excelDoc, sheetName); 
} 
+1

インターフェイスのクラス実装でテストしているメソッドはテストされていますか?あなたの言葉はちょっと混乱しています。 – Nkosi

+0

あなたは正しいです。 –

+1

これが当てはまる場合は、単体テストの依存関係を抽象化するという概念を混乱させることになります。 – Nkosi

答えて

1

あなたのユニットテストのためのあなたの依存関係を抽象化の概念を混乱されています。ここでは

は、私がGetWorksheetPartを呼び出す方法です。この方法はSpreadsheetDocument

SpreadsheetDocument外部コンポーネントに依存して、例えばクラスを

public class ExcelDocument { 

    public WorksheetPart GetWorksheetPart(SpreadsheetDocument excelDoc, string sheetName) 
    { 
     Sheet sheet = excelDoc.WorkbookPart.Workbook.Descendants<Sheet>() 
      .SingleOrDefault(s => s.Name == sheetName); 
     if (sheet == null) 
     { 
      throw new ArgumentException(
       String.Format("No sheet named {0} found in spreadsheet {1}", 
        sheetName, _filePath), "sheetName"); 
     } 
     return (WorksheetPart)excelDoc.WorkbookPart.GetPartById(sheet.Id); 
    } 
} 

を与え

は、この場合に抽象化される必要があるものです。

テスト中のメソッドを見ると、このメソッドはSheetを取得できる必要があります。その抽象化によってその機能が提供される必要があります。それはまた、次のインターフェイスは、これはあなたが今、モック/ FACKすることができ、この

public WorksheetPart GetWorksheetPart(ISpreadsheetDocument excelDoc, string sheetName) 
{ 
    Sheet sheet = excelDoc.GetSheet(sheetName); 
    if (sheet == null) 
    { 
     throw new ArgumentException(
      String.Format("No sheet named {0} found in spreadsheet {1}", 
       sheetName, _filePath), "sheetName"); 
    } 
    return excelDoc.GetPartById(sheet.Id); 
} 

被試験方法を変更

public ISpreadsheetDocument {  
    Sheet GetSheet(string name); 
    WorksheetPart GetPartById(string id); 
} 

を導出することができ、このからWorksheetPart

を取得できるようにする必要がありますユニットテストのために必要な場合はexcelDocを実行し、実動実装は外部機能をラップします。

public class SpreadsheetDocumentWrapper : ISpreadsheetDocument { 
    private SpreadsheetDocument excelDoc; 
    public SpreadsheetDocumentWrapper(SpreadsheetDocument excelDoc) { 
     this.excelDock = excelDock; 
    } 

    public Sheet GetSheet(string name) { 
     return excelDoc.WorkbookPart.Workbook.Descendants<Sheet>() 
      .SingleOrDefault(s => s.Name == sheetName); 
    } 

    public WorksheetPart GetPartById(string id) { 
     return (WorksheetPart)excelDoc.WorkbookPart.GetPartById(id); 
    } 
} 

だから、あなたが何をする必要があるかあなたはユニットテストのための模擬できるサービスにその依存関係と抽象それらの依存関係を識別し、あなたのExcelDocumentクラスを見ています。

+0

ありがとうNkosi、よく記述されています。今私は嘲笑しようとしている。私はここに例を作りました:https://dotnetfiddle.net/KZSN5B。 ユニットテストで 'GetWorksheetPart'の外観はどうなるのでしょうか? –

+0

これを新しい質問として投稿しました。これは既に答えられているので。再度、感謝します。 http://stackoverflow.com/questions/38638048/mocking-openxml-with-moq –

関連する問題