Классы юнит-тестирования, использующие EPPlus

У меня возникают проблемы с юнит-тестированием классов, использующих EPPlus. На мой взгляд, у меня есть два варианта.

Я могу издеваться и вставлять HttpPostedFileBase в метод, или я могу издеваться и внедрять класс EPPlus ExcelPackage.

Насмешка над HttpPostedFileBase, по крайней мере делающая настоящую насмешку, кажется ограниченной. Я могу смоделировать основные свойства файла (тип MIME, имя файла и т. Д.), Но макетировать его InputStream таким образом, который позволяет тестам фактически взаимодействовать с ним, кажется чрезвычайно сложным. Единственное решение, которое я могу придумать, - предоставить настоящий файл Excel, создать с ним настоящий FileStream и назначить этот FileStream моему ложному входному потоку HttpPostedFileBase InputStream. Но тогда это технически интеграционный тест, а не модульный тест.

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



Я подумал, что если я захочу провести реальный модульный тест, я мог бы вместо этого посмеяться над классом EPPlus ExcelPackage Затем я мог бы смоделировать связанные классы «Рабочий лист», «Столбцы» и «Ячейка», динамически устанавливая их свойства в соответствии с условиями моего теста, не затрагивая при этом настоящий файл. Проблема в том, что большинство классов EPPlus запечатаны, поэтому я не могу издеваться над ними с помощью FakeItEasy. Я попытался создать классы-обертки для них (см. Ниже), чтобы вместо этого можно было смоделировать класс-обертку ... но некоторые классы, которые мне нужно смоделировать / обернуть, имеют внутренние конструкторы, поэтому я не могу их создать. (Я попытался обойти внутреннюю проблему конструктора, используя пару уродливых хаков, но безуспешно.) И поэтому я ударил стену с помощью этой опции.

Я все еще новичок, и мне есть чему поучиться. Возможно, моя концепция класса-оболочки неверна, и я делаю это неправильно. Есть ли способ обойти это, которого я не вижу, или я должен просто сдаться, использовать настоящий файл Excel и назвать его интеграционным тестом? Пока что это то, к чему я склоняюсь.

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

Ответы на вопрос(1)

Ваш ответ на вопрос