2010-10-11 14 views
6

Excel dosyalarından veri okuyan küçük bir uygulama geliştirmek için bir TDD yaklaşımı kullanmaya başladım. Bir havuz modeli tipi yaklaşımı kullanarak, beni şaşırtan bir engele vardım.OpenXml-SDK ile TDD'yi Kullanma

Excel dosyaları okumak için OpenXml-SDK kullanıyorum. Şimdi tipik olarak SDK'yı kullanarak bir Excel dosyasından okumak, okumak istediğiniz değerleri gerçekten elde etmek için daha fazla adım yoksa birkaç tane gerektirir. Şimdiye kadar aldığım yaklaşım, aşağıdaki test ve eşlik eden fonksiyona yansıtılmıştır.

[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 
    } 
} 

Ancak elektronik tabloya sonraki adımlar aslında değerleri almak için Excel nesne modelini sorgulamaya başlamak olacaktır açıktır. Yukarıda belirtildiği gibi, açık xml ile ilgili herhangi bir şey için alaylardan yararlanıyorum. Ancak, bazı durumlarda nesneler alay edilemez (veya statik olduklarından dolayı bunları nasıl alay etmeyeceğimi bilmiyorum). Bu OpenXml-SDK içine sadece basit sarıcı çağrıları olan IOpenXmlUtilities ortaya çıktı.

Tasarım açısından, excel dosyalarından okuma verilerinin kısa süreli bir çözüm (6-8 ay) olduğunu biliyoruz, bu nedenle bu testler sadece o an için depo/veri erişimini etkiler.

Açıkçası, TDD yaklaşımından ayrılmak istemiyorum (olduğu gibi cazip), bu yüzden TDX çalışmalarına OpenXml SDK ile devam etme konusunda tavsiye ve rehberlik arıyorum. Diğer yönü alayla ilgilidir - bu durumda alayın ne zaman ve nasıl kullanılacağı konusunda kafam karıştı. OpenXml-SDK'yi test eden testleri bilmeden yazmak istemiyorum.

* Yan not: Tasarımımın SOLIDity'sinin geliştirilebileceğini biliyorum ancak şimdilik bunu bırakıyorum. builder nesnesine ilişkin bir dizi ayrı testim var. Oluşabilecek diğer yan etki, bir OpenXML-SDK sarıcı kütüphanesinin tasarımıdır.

Düzenleme: Şu anda Unbeknown, OpenXML-SDK için OpenXML-SDK sarmalayıcıları oluşturarak, Adaptor pattern olarak adlandırılan benzer (veya tam olarak) bir tasarım deseni kullandım.

+0

Bunun sizin için yararlı olup olmayacağından emin değilsiniz: http://stackoverflow.com/questions/3356503/automated-testing-openxml-sdk –

cevap

3

Eğer alay edemezseniz ve küçük bir envanter oluşturamazsanız, onu daha yüksek bir seviyeye çıkarmak ve senaryo testi yapmak daha iyi olabilir. Test için bir kurulum oluşturmak için [TestInitialize] ve [TestCleanup] yöntemlerini kullanabilirsiniz. Pex and Moles kullanılarak

, test edilmesinin başka bir yolu olabilir.