私は TDD アプローチを使用して、Excel ファイルからデータを読み取る小さなアプリを開発し始めました。リポジトリ パターン タイプのアプローチを使用して、私を困惑させるハードルに到達しました。
Excel ファイルを読み取るために、OpenXml-SDK を使用しています。通常、SDK を使用して Excel ファイルから読み取るには、実際に読み取りたい値を取得するためにいくつかの手順が必要です。
私がこれまでに取ったアプローチは、次のテストと付随する機能に反映されています。
[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
}
}
ただし、スプレッドシートを開いた後の次の手順は、実際に Excel オブジェクト モデルに問い合わせて値を取得することです。上で述べたように、私はオープン xml に関連するものすべてにモックを利用しています。ただし、場合によっては、オブジェクトをモックできない場合があります (または、オブジェクトが静的であるため、オブジェクトをモックする方法がわかりません)。これによりIOpenXmlUtilities
、OpenXml-SDK への単純なラッパー呼び出しにすぎません。
設計に関しては、Excel ファイルからのデータの読み取りは短期的な解決策 (6 ~ 8 か月) であることがわかっているため、これらのテストは、現時点ではリポジトリ/データ アクセスにのみ影響します。
明らかに、私は TDD アプローチを離れたくないので (魅力的ですが)、OpenXml SDK を使用して TDD の取り組みを継続する方法についてのアドバイスとガイダンスを探しています。もう 1 つの側面は、モッキングに関連しています。この場合、いつ、どのようにモックを使用するかについて、私は混乱しています。OpenXml-SDK をテストするテストを無意識のうちに作成したくありません。
*補足: デザインの SOLIDity を改善できることはわかっていますが、今のところはそのままにしておきます。オブジェクトに関連する一連の個別のテストがありbuilder
ます。発生する可能性のあるもう 1 つの副作用は、OpenXML-SDK ラッパー ライブラリの設計です。
編集:当時は不明でしたが、OpenXML-SDK 用の OpenXML-SDK ラッパーを作成することで、Adapter patternと呼ばれる (または正確な) デザイン パターンを使用しました。