Создайте выражение, которое соответствует, и используйте! Match () ... (логическое отрицание) Это, вероятно, так или иначе делает grep ...
Первое, что кажется неправильным в отношении функции сохранения, заключается в том, что на самом деле у нее есть две обязанности: она выбирает хранилище и сериализует граф объектов в это хранилище. Я бы начал с разделения ответственности:
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 на соответствие этой схеме, а также проверить, что он содержит значения, которые вы задаете. ищу.
В таких случаях я использую XNode.DeepEquals для сравнения экземпляров XML друг с другом, потому что он сравнивает структуру, а не байты.