2016-07-27 2 views
1

Я хотел бы использовать процесс, описанный здесь: Automated Testing OpenXML SDK (также коснулись здесь: Unit testing an application that talks to microsoft word via OpenXML)Mocking OpenXML SDK ТабличныйДокумент

Однако то, что это берет, чтобы дразнить что-то вроде этого? я сделал следующий интерфейс:

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 и не уверен, даже если это разумно.

Вот как я называю GetWorksheetPart:

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

Испытывается ли ваш метод в классе реализации интерфейса? Ваша формулировка немного запутанна. – Nkosi

+0

У вас все получилось. –

+1

Если это так, то вы вводите в заблуждение концепцию абстрагирования ваших зависимостей для вашего модульного теста. – Nkosi

ответ

1

Вы путаете понятие абстрагируясь ваших зависимостей для модульного тестирования.

приведен пример класс

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); 
    } 
} 

этот метод зависит от внешнего компонента SpreadsheetDocument

SpreadsheetDocument это то, что должно быть отведенной в этом случае.

Если вы изучаете метод, метод должен иметь возможность получить Sheet, поэтому ваша абстракция должна обеспечивать эту функциональность. он также должен быть в состоянии получить WorksheetPart

из этого следующий интерфейс может быть получен

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

Это изменяет метод испытываемого к этому

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); 
} 

Теперь вы можете издеваться/FACK 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 класса, определить его зависимость и абстрактные эти зависимости OuT в услуги, которые вы можете насмехаетесь для модульного тестирования.

+0

Спасибо Nkosi, хорошо описано. Сейчас я пытаюсь насмехаться. Я создал здесь пример: https://dotnetfiddle.net/KZSN5B. Не могли бы вы предложить, как бы выглядел модульный тест для 'GetWorksheetPart'? –

+0

Добавлено как новый вопрос. Как уже сказано. Еще раз спасибо. http://stackoverflow.com/questions/38638048/mocking-openxml-with-moq –

 Смежные вопросы

  • Нет связанных вопросов^_^