You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:25:19