XUnit测试中如何直接设置类模型条件初始化器属性Id的值
在XUnit测试中设置只读计算属性
Id的方法 你的Id是只读计算属性,它的值由类内部的私有字段IdField或RefField决定,无法直接给Id赋值。要在测试中控制它的值,有两种可行方案:
方案1:通过反射修改私有字段
无需改动原模型代码,直接用反射访问并修改私有字段:
using System.Reflection; using Xunit; public class RelationContentTypeObjectTests { [Fact] public void TestSetIdViaIdField() { // 创建测试实例 var testObj = new RelationContentTypeObject(); // 获取私有字段IdField var idFieldInfo = typeof(RelationContentTypeObject) .GetField("IdField", BindingFlags.NonPublic | BindingFlags.Instance); // 设置字段值 idFieldInfo.SetValue(testObj, "my-test-id"); // 验证Id属性返回预期值 Assert.Equal("my-test-id", testObj.Id); } [Fact] public void TestSetIdViaRefField() { var testObj = new RelationContentTypeObject(); var refFieldInfo = typeof(RelationContentTypeObject) .GetField("RefField", BindingFlags.NonPublic | BindingFlags.Instance); refFieldInfo.SetValue(testObj, "my-test-ref"); Assert.Equal("my-test-ref", testObj.Id); } }
方案2:调整访问修饰符(更简洁)
如果允许修改原模型代码,可以把私有字段改为internal,并通过InternalsVisibleTo特性让测试项目能访问这些内部成员:
步骤1:修改模型类
public class RelationContentTypeObject { [JsonProperty("$id")] internal string IdField { get; set; } [JsonProperty("$ref")] internal string RefField { get; set; } [JsonIgnore] public string Id => IdField ?? RefField; }
步骤2:在模型所在项目添加特性
在模型项目的AssemblyInfo.cs(或直接在模型类所在文件顶部)添加:
[assembly: InternalsVisibleTo("YourTestProjectName")]
替换YourTestProjectName为你的XUnit测试项目的程序集名称。
步骤3:测试中直接赋值
public class RelationContentTypeObjectTests { [Fact] public void TestSetIdDirectly() { var testObj = new RelationContentTypeObject(); testObj.IdField = "my-direct-test-id"; Assert.Equal("my-direct-test-id", testObj.Id); } }
两种方案对比:反射方案无需改动原代码,但代码稍繁琐;调整访问修饰符的方案更简洁,适合有权限修改模型代码的场景。
内容的提问来源于stack exchange,提问作者Harikarthik
相关产品推荐
相关产品推荐

