如何使用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添加仅用于测试的内部属性,通过特性让测试项目访问该属性,兼顾封装性和可测试性:
- 修改
SpreadsheetValuesList类:
public class SpreadsheetValuesList { private readonly List<SpreadsheetValue> _spreadsheetValues = new(); // 仅测试用的内部属性,对外不可见 internal List<SpreadsheetValue> TestableValues => _spreadsheetValues; // 原有构造方法和公共方法... }
- 在
SpreadsheetValuesList所在项目的AssemblyInfo.cs中添加特性,允许测试项目访问内部成员:
[assembly: InternalsVisibleTo("你的测试项目名称")]
- 在测试中配置Verify,将该内部属性加入验证内容:
await Verify(viewModel) .AddExtraInfo("SpreadsheetValues", viewModel.SpreadsheetList.TestableValues);
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

