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

如何使用VerifyTests验证类的私有成员(不破坏封装)

解决VerifyTests无法序列化私有成员的问题

以下几种方法可以在不破坏类封装的前提下,让VerifyTests输出私有成员的数据:

方法1:配置序列化器包含私有字段

Verify默认使用System.Text.Json序列化对象,默认不处理私有字段。可以通过修改序列化配置,开启私有字段的序列化:

await Verify(viewModel)
    .UseSettings(settings =>
    {
        // 开启所有类的字段序列化(包括私有字段)
        settings.JsonSerializerOptions.IncludeFields = true;
    });

注意:这种方式会序列化所有类的私有字段,若只需针对特定类处理,推荐使用下面的自定义转换器方法。

方法2:自定义序列化转换器处理特定类

针对SpreadsheetValuesList编写专属转换器,精准控制该类的序列化逻辑,提取私有成员数据:

// 自定义转换器,继承Verify的WriteOnlyJsonConverter
public class SpreadsheetValuesListConverter : WriteOnlyJsonConverter<SpreadsheetValuesList>
{
    public override void Write(VerifyJsonWriter writer, SpreadsheetValuesList value)
    {
        // 通过反射获取私有字段值
        var field = typeof(SpreadsheetValuesList)
            .GetField("_spreadsheetValues", BindingFlags.NonPublic | BindingFlags.Instance);
        var values = (List<SpreadsheetValue>)field.GetValue(value);
        
        writer.WriteStartObject();
        writer.WriteMember("SpreadsheetValues", values);
        writer.WriteEndObject();

        // 也可以直接复用类已有的ToJson方法输出:
        // writer.WriteRawValue(value.ToJson());
    }
}

// 测试中使用转换器
await Verify(viewModel)
    .AddConverter(new SpreadsheetValuesListConverter());

方法3:添加测试专用内部成员(推荐)

给SpreadsheetValuesList添加仅用于测试的内部属性,通过特性让测试项目访问该属性,兼顾封装性和可测试性:

  1. 修改SpreadsheetValuesList类:
public class SpreadsheetValuesList
{
    private readonly List<SpreadsheetValue> _spreadsheetValues = new();

    // 仅测试用的内部属性,对外不可见
    internal List<SpreadsheetValue> TestableValues => _spreadsheetValues;

    // 原有构造方法和公共方法...
}
  1. 在SpreadsheetValuesList所在项目的AssemblyInfo.cs中添加特性,允许测试项目访问内部成员:
[assembly: InternalsVisibleTo("你的测试项目名称")]
  1. 在测试中配置Verify,将该内部属性加入验证内容:
await Verify(viewModel)
    .AddExtraInfo("SpreadsheetValues", viewModel.SpreadsheetList.TestableValues);

内容的提问来源于stack exchange,提问作者Jess

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:53:26