TDD с зависимостями файловой системы - PullRequest
6 голосов
/ 09 сентября 2010

У меня есть интеграционный тест LoadFile_DataLoaded_Successfully () . И я хочу реорганизовать его в модульный тест для разрыва зависимости с filesytem.

P.S. Я новичок в TDD:

Вот мой производственный класс:

public class LocalizationData
{
    private bool IsValidFileName(string fileName)
    {
        if (fileName.ToLower().EndsWith("xml"))
        {
            return true;
        }
        return false;
    }

    public XmlDataProvider LoadFile(string fileName)
    {
        if (IsValidFileName(fileName))
        {
            XmlDataProvider provider = 
                            new XmlDataProvider
                                 {
                                      IsAsynchronous = false,
                                      Source = new Uri(fileName, UriKind.Absolute)
                                 };

            return provider;
        }
        return null;
    }
}

и мой тестовый класс (Nunit)

[TestFixture]
class LocalizationDataTest
{
    [Test]
    public void LoadFile_DataLoaded_Successfully()
    {
        var data = new LocalizationData();
        string fileName = "d:/azeri.xml";
        XmlDataProvider result = data.LoadFile(fileName);
        Assert.IsNotNull(result);
        Assert.That(result.Document, Is.Not.Null);
    }
}

Любая идея, как его реорганизовать, чтобы нарушить зависимость файловой системы

Ответы [ 11 ]

0 голосов
/ 09 сентября 2010

В этом случае вы находитесь на более низком уровне зависимости.Вы проверяете, что файл существует и что xmlprovider может быть создан с файлом в качестве источника.

Единственный способ, которым вы могли бы сломать зависимость, - это ввести что-то для создания XmlDataProvider.Затем вы могли бы посмеяться над ним, чтобы вернуть XmlDataProvider, который вы создали (в отличие от чтения).В качестве упрощенного примера можно привести:

class XmlDataProviderFactory
{
    public virtual XmlDataProvider NewXmlDataProvider(string fileName)
    {
       return  new XmlDataProvider
                   {
                       IsAsynchronous = false,
                       Source = new Uri(fileName, UriKind.Absolute)
                   };
}

class XmlDataProviderFactoryMock : XmlDataProviderFactory
{
    public override XmlDataProvider NewXmlDataProvider(string fileName)
    {
        return new XmlDataProvider();
    }
}

public class LocalizationData
{
...
    public XmlDataProvider LoadFile(string fileName, XmlDataProviderFactory factory)
        {
            if (IsValidFileName(fileName))
            {
                return factory.NewXmlDataProvider(fileName);
            }
            return null;
        }
}

[TestFixture]
class LocalizationDataTest
{
    [Test]
    public void LoadFile_DataLoaded_Succefully()
    {
        var data = new LocalizationData();
        string fileName = "d:/azeri.xml";
        XmlDataProvider result = data.LoadFile(fileName, new XmlDataProviderFactoryMock());
        Assert.IsNotNull(result);
        Assert.That(result.Document, Is.Not.Null);
    }

}

Использование инфраструктуры инъекций может упростить вызов до LoadFile путем внедрения фабрики в конструктор класса или в другое место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...