Классы юнит-тестирования, использующие 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();
}
}