Модульное тестирование функции, которая выводит через XmlWriter? - PullRequest
5 голосов
/ 08 октября 2009

Я пытаюсь пройти модульное тестирование и TDD способ выполнения задач, но я столкнулся с проблемой, я не уверен, что делать.

У меня есть коллекция, которая сохраняет себя на диск, используя XDocument и XmlWriter. Я знаю, что вы не должны записывать файл на диск, а затем проверять его, чтобы у меня был вывод XmlWriter в поток памяти, а затем я проверил содержимое потока памяти. Функция выглядит так:

   public void Save()
    {
        using (XmlWriter xmlWriter = XmlWriter.Create(m_StreamProvider.SaveFileStream(m_FilenameProvider.Filename)))
        {
            XDocument xDoc = new XDocument(new XElement("BookmarkCollection",
                    Items.Select(bookmark => new XElement("Bookmark",
                        new XElement("Name", bookmark.Name),
                        new XElement("Link", bookmark.Link),
                        new XElement("Remarks", bookmark.Remarks),
                        new XElement("DateAdded", bookmark.DateAdded),
                        new XElement("DateLastAccessed", bookmark.DateLastAccessed))
                        )
                        ));

            xDoc.Save(xmlWriter);
        }

    }

И юнит тест

[Test]
    public void Save_OneItemCollection_XmlCreatedCorrectly()
    {
        //Arrange
        MemoryStreamProvider streamProvider = new MemoryStreamProvider();
        IBookmarkCollection collection = XBookmarkTestHelpers.GetXBookmarkCollection(streamProvider);

        IBookmark bookmarkToAdd = XBookmarkTestHelpers.GetIBookmark("myLink");
        collection.Add(bookmarkToAdd);

        //Act
        collection.Save();

        //Assert
        streamProvider.WriteStrean.Position = 0;
        String generatedXml = Encoding.Default.GetString(streamProvider.WriteStrean.GetBuffer());

        Assert.IsTrue(String.Equals(generatedXml, m_ExpectedOneItemString), "XML does not match");
    }

Утверждение здесь не слишком хрупкое (я знаю, что мог бы использовать String.Compare (), но у него были бы подобные проблемы.), Я проверяю правильную вещь? Я издеваюсь не над тем?

Весь вклад приветствуется!

Ответы [ 2 ]

4 голосов
/ 08 октября 2009

Первое, что кажется неправильным в функции Save, это то, что она на самом деле имеет две обязанности: она выбирает хранилище и сериализует граф объектов в это хранилище. Я бы начал с выделения обязанностей:

public void Save(XmlWriter xmlWriter)
{
    XDocument xDoc = new XDocument(new XElement("BookmarkCollection",
        Items.Select(bookmark => new XElement("Bookmark",
            new XElement("Name", bookmark.Name),
            new XElement("Link", bookmark.Link),
            new XElement("Remarks", bookmark.Remarks),
            new XElement("DateAdded", bookmark.DateAdded),
            new XElement("DateLastAccessed", bookmark.DateLastAccessed))
        )
    ));
    xDoc.Save(xmlWriter);
}

public void Save()
{
    using (XmlWriter xmlWriter = XmlWriter.Create(m_StreamProvider.SaveFileStream(m_FilenameProvider.Filename)))
    {
        Save(xmlWriter);
    }
}

Что касается модульного теста, вы можете определить схему XSD и затем проверить полученный XML-код по этой схеме, а также проверить, что он содержит значения, которые вы ищете.

0 голосов
/ 08 октября 2009

В таких случаях я использую XNode.DeepEquals для сравнения экземпляров XML друг с другом, потому что он сравнивает структуру, а не байты.

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