Clases de pruebas unitarias que usan EPPlus

Tengo problemas con las clases de prueba de unidad que usan EPPlus. En mi mente, tengo dos opciones.

Puedo simular e inyectar el HttpPostedFileBase en un método, o puedo simular e inyectar la clase EPPlus ExcelPackage.

Burlarse de HttpPostedFileBase, al menos hacer un simulacro verdadero, parece limitado. Puedo simular las propiedades básicas del archivo (tipo MIME, nombre de archivo, etc.), pero simular su InputStream de una manera que permita que las pruebas realmente interactúen con él, parece extremadamente difícil. La única solución que se me ocurre es proporcionar un archivo de Excel real, crear un FileStream real con él y asignar ese FileStream a mi InputStream simulado de HttpPostedFileBase. Pero técnicamente es una prueba de integración, no una prueba unitaria.

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



Pensé que si quería hacer una prueba de unidad real, podría burlarme e inyectar la clase EPPlus ExcelPackage. Luego podría burlarme de las clases relacionadas de Hoja de trabajo, Columnas y Celdas, estableciendo sus propiedades dinámicamente para que se ajusten a las condiciones de mi prueba, sin tocar nunca un archivo real. El problema es que la mayoría de las clases EPPlus están selladas, por lo que no puedo burlarme de ellas con FakeItEasy. Intenté crear clases de envoltura para ellos (ver más abajo), para poder burlarme de la clase de envoltura en su lugar ... pero algunas de las clases que necesito simular / envolver tienen constructores internos, por lo que no puedo instanciarlos. (Intenté solucionar el problema interno del constructor usando un par de trucos feos, pero no tuve éxito). Y así que me golpeé un muro con esta opción.

Todavía soy un novato y tengo mucho que aprender. Quizás mi concepto de una clase de contenedor es incorrecto, y lo estoy haciendo mal. ¿Hay alguna forma de evitar esto que no puedo ver, o debería simplemente rendirme, usar un archivo de Excel real y llamarlo una prueba de integración? Hasta ahora, eso es hacia lo que me estoy inclinando.

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta