单元测试通过XmlWriter输出的函数?

5 .net c# unit-testing

我正试图进入单元测试和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);
        }

    }
Run Code Online (Sandbox Code Playgroud)

单元测试是

[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");
    }
Run Code Online (Sandbox Code Playgroud)

这里的断言太脆弱了(我知道我可以使用String.Compare()但它会有类似的问题.),我测试的是正确的吗?我嘲笑错了吗?

所有输入非常感谢!

Dar*_*rov 5

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

就单元测试而言,您可以定义一个 XSD 架构,然后根据该架构验证结果 XML,并测试它是否包含您要查找的值。