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