我正试图进入单元测试和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()但它会有类似的问题.),我测试的是正确的吗?我嘲笑错了吗?
所有输入非常感谢!
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,并测试它是否包含您要查找的值。