2010-10-11 13 views
6

Comencé a utilizar un enfoque TDD para desarrollar una aplicación pequeña que lea datos de archivos de Excel. Utilizando un enfoque de tipo de patrón de repositorio, he llegado a un obstáculo que me desconcierta.Uso de TDD con OpenXML-SDK

Para leer los archivos de Excel, estoy usando OpenXML-SDK. Ahora, por lo general, la lectura desde un archivo de Excel utilizando el SDK requiere varios pasos, si no más, para obtener realmente los valores que desea leer.

El enfoque que he tomado hasta ahora se refleja en la siguiente prueba y la función que lo acompaña.

[Test] 
    public void GetRateData_ShouldReturn_SpreadSheetDocument() 
    { 
     //Arrange 
     var fpBuilder = new Mock<IDirectoryBuilder>(); 
     fpBuilder.Setup(fp => fp.FullPath()).Returns(It.IsAny<string>()); 

     var doc = new Mock<IOpenXmlUtilities>(); 
     doc.Setup(d => d.OpenReadOnlySpreadSheet(It.IsAny<string>())) 
      .Returns(Mock.Of<SpreadsheetDocument>()); 

     swapData = new SwapRatesRepository(fpBuilder.Object, doc.Object); 

     //Act 
     var result = swapData.GetRateData(); 

     //Assert 
     doc.Verify(); 
     fpBuilder.Verify(); 
    } 

public class SwapRatesRepository: IRatesRepository<SwapRates> 
{ 
    private const string SWAP_DATA_FILENAME = "DATE_MKT_ZAR_SWAPFRA1.xlsx"; 
    private IDirectoryBuilder builder; 
    private IOpenXmlUtilities openUtils; 

    public SwapRatesRepository(IDirectoryBuilder builder) 
    { 
     // TODO: Complete member initialization 
     this.builder = builder; 
    } 

    public SwapRatesRepository(IDirectoryBuilder builder, 
             IOpenXmlUtilities openUtils) 
    { 
     // TODO: Complete member initialization 
     this.builder = builder; 
     this.openUtils = openUtils; 
    } 

    public SwapRates GetRateData() 
    { 
     // determine the path of the file based on the date 
     builder.FileName = SWAP_DATA_FILENAME; 
     var path = builder.FullPath(); 

     // open the excel file 
     using(SpreadsheetDocument doc = openUtils.OpenReadOnlySpreadSheet(path)) 
     { 
      //WorkbookPart wkBookPart = doc.WorkbookPart; 
      //WorksheetPart wkSheetPart = wkBookPart.WorksheetParts.First(); 
      //SheetData sheetData = wkSheetPart.Worksheet 
      //         .GetFirstChild<SheetData>(); 

     } 

     return new SwapRates(); // ignore this class for now, design later 
    } 
} 

Sin embargo, los próximos pasos después de la hoja de cálculo está abierta sería empezar realmente interrogar el modelo de objetos de Excel para recuperar los valores. Como se señaló anteriormente, hago uso de simulaciones para todo lo relacionado con XML abierto. Sin embargo, en algunos casos los objetos no se pueden burlar (o no sé cómo burlarse de ellos ya que son estáticos). Eso dio lugar a IOpenXmlUtilities que son simplemente llamadas de contenedor simples en el OpenXml-SDK.

En términos de diseño, sabemos que leer datos de archivos Excel es una solución a corto plazo (6-8 meses), por lo que estas pruebas solo afectan el repositorio/acceso a datos por el momento.

Obviamente, no quiero dejar el enfoque TDD (por muy tentador que sea), así que estoy buscando asesoramiento y orientación sobre cómo continuar mis esfuerzos TDD con OpenXML SDK. El otro aspecto se relaciona con la burla. En este caso, no estoy seguro de cuándo y cómo usar burlas. No quiero, sin saberlo, escribir pruebas que prueben el OpenXml-SDK.

* Nota al margen: Sé que la SOLIDidad de mi diseño se puede mejorar, pero lo dejo por ahora. Tengo un conjunto de pruebas separadas que se relacionan con el objeto builder. El otro efecto secundario que puede ocurrir es el diseño de una biblioteca de contenedor OpenXML-SDK.

Editar: Desconocido en ese momento, al crear los contenedores OpenXML-SDK para OpenXML-SDK, he utilizado un patrón de diseño similar (o exacto) llamado Adaptor pattern.

+0

No estoy seguro si esto te será útil, pero aquí: http://stackoverflow.com/questions/3356503/automated-testing-openxml-sdk –

Respuesta

3

Si no puede simularlo y no puede crear una pequeña prueba unitaria, podría ser mejor llevarlo a un nivel superior y realizar una prueba de escenario. Puede usar los métodos [TestInitialize] y [TestCleanup] para crear una configuración para la prueba.

usando Pex and Moles podría ser otra forma de probarlo.