Wie soll ich die folgende GetWorksheetPart
Methode testen:Mocking OpenXML mit Moq
public class ExcelDocument : IExcelDocument
{
private readonly string _filePath;
public ExcelDocument(string filePath)
{
_filePath = filePath;
}
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);
}
}
Wo IExcelDocument
und SpreadsheetDocumentWrapper
der Wrapper-Schnittstellen sind:
public interface IExcelDocument
{
WorksheetPart GetWorksheetPart(ISpreadsheetDocument excelDoc, string sheetName);
}
public interface ISpreadsheetDocument
{
Sheet GetSheet(string name);
WorksheetPart GetPartById(string id);
}
Hier ist die Hülle selbst.
public class SpreadsheetDocumentWrapper : ISpreadsheetDocument
{
private SpreadsheetDocument excelDoc;
public SpreadsheetDocumentWrapper(SpreadsheetDocument excelDoc)
{
this.excelDoc = excelDoc;
}
public Sheet GetSheet(string sheetName)
{
return excelDoc.WorkbookPart.Workbook.Descendants<Sheet>()
.SingleOrDefault(s => s.Name == sheetName);
}
public WorksheetPart GetPartById(string id)
{
return (WorksheetPart)excelDoc.WorkbookPart.GetPartById(id);
}
}
Schließlich ist der Test, den ich für GetWorksheetPart
umzusetzen versucht. Problem mit diesem ist, dass ich nicht sicher bin, wie man diese Funktionalität prüft. Idee ist, einen WorksheetPart
den Blattnamen und das Tabellenkalkulationsdokument zu erhalten.
public class Test
{
[TestClass()]
public class ExcelUpdateLogicTests
{
[TestMethod()]
public void Excel_GetWorkseetPartTest()
{
Mock<ISpreadsheetDocument> mockSpreadhseet = new Mock<ISpreadsheetDocument>();
Sheet sheet = new Sheet();
string id = "1";
sheet.Name = "sheet";
sheet.Id = id;
mockSpreadhseet.Setup(doc => doc.GetSheet("sheet")).Returns(sheet);
mockSpreadhseet.Setup(doc => doc.GetPartById(id)).Returns(????);
Mock<IExcelDocument> mockExcelDocument = new Mock<IExcelDocument>();
WorksheetPart mockWorkseet = mockExcelDocument.Object
.GetWorksheetPart(mockSpreadhseet.Object, "sheet");
Assert.IsTrue(mockWorkseet.GetIdOfPart(mockWorkseet) == id);
}
}
}
Hier ist der allgemeine OpenXML Strukturbaum für Tabellen:
Spreadsheet | WorkbookPart / | \ Workbook WorkbookStylesPart WorksheetPart | | | Sheets StyleSheet Worksheet | / \ (refers to SheetData Columns Worksheetparts) | Rows
Danke für die Antwort. Ich stimme Ihrem Kommentar zur Redundanz zu. Angesichts Ihres Tests sieht es so aus, als wäre der 'SpreadsheetDocumentWrapper' redundant und ich könnte direkt das 'ExcelDocument'-Objekt testen, das im Speicher geladen ist. Ich habe einen Test mit 'Moq' und' Verify' gemacht. Könntest du dir das ansehen und deinen Kommentar abgeben warum man über das andere https://dotnetfiddle.net/hVHvlM? –
Ich habe den Test überprüft und es funktioniert. Aber während der Test besteht und Ihre Verifikationsaufrufe bestehen, ist das 'mockWorksheet'' null'. Mein Rat wäre, zu versuchen, Ihre Interaktion mit OpenXML-Teilen auf einer höheren Ebene zu abstrahieren und zu vermeiden, die Teile bloßzustellen, die Implementierungsdetails zu sein scheinen. – Nkosi
Sie haben Recht, das 'mockWorksheet' ist null. Es überprüft nur Methodenaufrufe. Wenn du höheres Niveau sagst, was genau meinst du? Ist es etwas, was du schon gezeigt hast oder ist das etwas anderes in dir? Wenn dies hilft, ist die Idee für die Anwendung, Zeilen in das ".xlsx" -Dokument einzufügen und es gibt keine Benutzeroberfläche, reines Backend. –