Unit-Test-Klassen, die EPPlus verwenden

Ich habe Probleme mit Unit-Test-Klassen, die EPPlus verwenden. Ich habe zwei Möglichkeiten.

Ich kann die HttpPostedFileBase verspotten und in eine Methode injizieren, oder ich kann die EPPlus ExcelPackage-Klasse verspotten und injizieren.

Das Verspotten der HttpPostedFileBase, zumindest ein echtes Verspotten, scheint begrenzt zu sein. Ich kann die grundlegenden Eigenschaften der Datei (MIME-Typ, Dateiname usw.) verspotten, aber es scheint extrem schwierig, den InputStream so zu verspotten, dass die Tests tatsächlich damit interagieren können. Die einzige Lösung, die ich finden kann, besteht darin, eine echte Excel-Datei bereitzustellen, einen echten FileStream damit zu erstellen und diesen FileStream meinem nachgebildeten InputStream von HttpPostedFileBase zuzuweisen. Aber dann ist es technisch ein Integrationstest, kein Komponententest.

const string FakeFileName = "TestExcelFile.xlsx"; // path to an actual excel file
var fileStream = new FileStream(FilePath, FileMode.Open);
var fakeFile = A.Fake<HttpPostedFileBase>();
A.CallTo(() => fakeFile.InputStream).Returns(fileStream);



Ich dachte, wenn ich einen tatsächlichen Komponententest machen wollte, könnte ich stattdessen die EPPlus ExcelPackage-Klasse verspotten und injizieren. Ich könnte dann die zugehörigen Arbeitsblatt-, Spalten- und Zellklassen verspotten und ihre Eigenschaften dynamisch so einstellen, dass sie den Bedingungen meines Tests entsprechen, ohne eine echte Datei zu berühren. Das Problem ist, dass die meisten EPPlus-Klassen versiegelt sind, so dass ich sie nicht mit FakeItEasy verspotten kann. Ich habe versucht, Wrapper-Klassen für sie zu erstellen (siehe unten), damit ich stattdessen die Wrapper-Klasse verspotten kann ... aber einige der Klassen, die ich verspotten / umbrechen muss, haben interne Konstruktoren, sodass ich sie nicht instanziieren kann. (Ich habe versucht, das interne Konstruktorproblem mit ein paar hässlichen Hacks zu umgehen, hatte aber keinen Erfolg.) Und so bin ich mit dieser Option an eine Wand geraten.

Ich bin noch ein Anfänger und habe viel zu lernen. Vielleicht ist mein Konzept einer Wrapper-Klasse falsch und ich mache es falsch. Gibt es einen Weg, den ich nicht sehen kann, oder sollte ich einfach aufgeben, eine echte Excel-Datei verwenden und es einen Integrationstest nennen? Soweit neige ich dazu.

public class ExcelWorksheetsWrapper : IEnumerable<ExcelWorksheet>
{
    public readonly ExcelWorksheets _excelWorksheets;

    public ExcelWorksheetsWrapper()
    {
        // internal constructor, can't instantiate
        _excelWorksheets = new ExcelWorksheets();       
    }

    public ExcelWorksheet Add(string worksheetName)
    {
        return _excelWorksheets.Add(worksheetName);
    }

    public IEnumerator<ExcelWorksheet> GetEnumerator()
    {
        return _excelWorksheets.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return _excelWorksheets.GetEnumerator();
    }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage