6


1

OpenXml-SDKでTDDを使用する

TDDアプローチを使用して、Excelファイルからデータを読み取る小さなアプリを開発し始めました。 リポジトリパターンタイプのアプローチを使用すると、私は難題に直面します。

Excelファイルを読み取るために、OpenXml-SDKを使用しています。 現在、通常、SDKを使用してExcelファイルから読み取るには、読み取りたい値を実際に取得するために、さらに多くの手順が必要になります。

私がこれまでに取ったアプローチは、次のテストと付随する機能に反映されています。

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

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

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

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

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

public class SwapRatesRepository: IRatesRepository
{
    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();

        }

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

ただし、スプレッドシートを開いた後の次の手順は、Excelオブジェクトモデルへの問い合わせを実際に開始して値を取得することです。 上記のように、私はオープンXML関連のあらゆるものにモックを利用しています。 ただし、場合によっては、オブジェクトをモックできないことがあります(または静的であるため、オブジェクトをモックする方法がわかりません)。 これにより、OpenXml-SDKへの単純なラッパー呼び出しである「IOpenXmlUtilities」が発生しました。

設計面では、Excelファイルからデータを読み取ることは短期的なソリューション(6〜8か月)であることがわかっているため、これらのテストは現時点ではリポジトリ/データアクセスにのみ影響します。

明らかに、TDDアプローチ(そのままでは魅力的)を離れたくないので、OpenXml SDKでTDDの取り組みを継続する方法に関するアドバイスとガイダンスを探しています。 もう1つの側面は、モックに関するものです。この場合、モックをいつどのように使用するかについて混乱しています。 私は無意識のうちにOpenXml-SDKをテストするテストを書きたくありません。

*サイドノート:私のデザインのSOLIDityを改善できることは知っていますが、今のところはそのままにします。 `builder`オブジェクトに関連する一連の個別のテストがあります。 発生する可能性があるもう1つの副作用は、OpenXML-SDKラッパーライブラリの設計です。

編集:OpenXML-SDKのOpenXML-SDKラッパーを作成することにより、現時点では不明ですが、https://stackoverflow.com/questions/150341/tdd-and-mockingと呼ばれる同様の(または正確な)デザインパターンを使用しました-out-tcpclient [アダプターパターン]。

1 Answer


3


あなたがそれをモックできず、小さなユニットテストを作成できない場合、それをより高いレベルに持っていき、シナリオテストを行う方が良いかもしれません。 [TestInitialize]および[TestCleanup]メソッドを使用して、テストのセットアップを作成できます。

Pex and Molesを使用することも、テストする別の方法です。