如何用Verify快照包测试XML序列化往返并指定基准文件?
问题:如何指定Verify使用原XML文件作为基准比对而非自动生成的.verified.txt?
我想用Verify测试反序列化后的XML文档重新序列化后与原测试文档匹配,原文档是测试的基准版本,请问有没有简便方法指定用它来比对,而非自动生成的.verified.txt文件?
例如,现有如下Person类:
public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }
以及如下测试方法:
[Fact] public async void Person_CanRoundTrip() { var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "MyPerson.xml"); XmlSerializer serializer = new XmlSerializer(typeof(Person)); Person? p; // 反序列化XML await using (var fs = new FileStream(filePath, FileMode.Open)) { p = (Person?)serializer.Deserialize(fs); } // 重新序列化,验证两个XML文档是否匹配 var generatedXDoc = new XDocument(); await using (var xmlWriter = generatedXDoc.CreateWriter()) { serializer.Serialize(xmlWriter, p); }; // 如何让Verify使用原文件MyPerson.xml作为比对基准? await Verify(generatedXDoc); }
我知道可以复制原文件并添加.verified.txt后缀,但希望避免出现差异时该文件被覆盖。
解决方案
有两种简便方法可以直接指定原XML文件作为基准,无需复制文件或担心被覆盖:
方法一:传入原文件内容作为基准
使用UseTextForVerification方法,读取原XML文件的内容后传入,让Verify以此作为比对基准:
[Fact] public async Task Person_CanRoundTrip() // 建议将async void改为async Task,符合测试规范 { var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "MyPerson.xml"); XmlSerializer serializer = new XmlSerializer(typeof(Person)); Person? p; // 读取原XML文件内容作为基准 var originalXmlContent = await File.ReadAllTextAsync(filePath); // 反序列化XML await using (var fs = new FileStream(filePath, FileMode.Open)) { p = (Person?)serializer.Deserialize(fs); } // 重新序列化 var generatedXDoc = new XDocument(); await using (var xmlWriter = generatedXDoc.CreateWriter()) { serializer.Serialize(xmlWriter, p); }; // 指定用原文件内容作为基准比对 await Verify(generatedXDoc) .UseTextForVerification(originalXmlContent); }
方法二:直接指定基准文件路径
使用UseExistingFile方法,直接传入原XML文件的路径,Verify会读取该文件作为基准:
[Fact] public async Task Person_CanRoundTrip() { var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "MyPerson.xml"); XmlSerializer serializer = new XmlSerializer(typeof(Person)); Person? p; // 反序列化XML await using (var fs = new FileStream(filePath, FileMode.Open)) { p = (Person?)serializer.Deserialize(fs); } // 重新序列化 var generatedXDoc = new XDocument(); await using (var xmlWriter = generatedXDoc.CreateWriter()) { serializer.Serialize(xmlWriter, p); }; // 指定原文件作为基准 await Verify(generatedXDoc) .UseExistingFile(filePath); }
这两种方法都不会生成或自动覆盖基准文件,完全基于你指定的原XML文档进行比对,完美解决你的需求。
内容的提问来源于stack exchange,提问作者JohnGoldsmith
相关产品推荐
相关产品推荐

