Использование TDD с OpenXml-SDK - PullRequest
       6

Использование TDD с OpenXml-SDK

6 голосов
/ 11 октября 2010

Я начал использовать подход TDD для разработки небольшого приложения, которое считывает данные из файлов Excel.Используя подход типа шаблона репозитория, я столкнулся с препятствием, которое ставит меня в тупик.

Чтобы читать файлы Excel, я использую OpenXml-SDK.Теперь, как правило, для чтения из файла Excel с использованием SDK требуется несколько, если не больше, шагов для получения значений, которые вы хотите прочитать.

Подход, который я до сих пор использовал, отражен в следующем тесте и сопутствующей функции.

    [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 (каким бы заманчивым он ни был), поэтому я ищу советы и рекомендации о том, как продолжить работу над TDD с помощью OpenXml SDK.Другой аспект касается насмешек - меня смущает, когда и как использовать издевательства в этом случае.Я не хочу по незнанию писать тесты, которые тестируют OpenXml-SDK.

* Примечание: я знаю, что ТВЕРДОСТЬ моего дизайна может быть улучшена, но я оставляю это сейчас.У меня есть набор отдельных тестов, которые относятся к объекту builder.Другим побочным эффектом, который может возникнуть, является дизайн библиотеки оболочки OpenXML-SDK.

Редактировать: В то время неизвестно, создавая оболочки OpenXML-SDK для OpenXML-SDK, я использовал шаблон проектированияаналог (или точный) называется Адаптер шаблон .

1 Ответ

3 голосов
/ 01 апреля 2011

Если вы не можете издеваться над ним и не можете создать небольшой юнит-тест, лучше поднять его на более высокий уровень и выполнить тест сценария. Вы можете использовать методы [TestInitialize] и [TestCleanup], чтобы создать настройку для теста.

использование Pex и Moles может быть еще одним способом тестирования.

...