ASP.NET WebForm单元测试Mock Telerik RadDropDownList报类型转换错误如何解决
错误原因
你遇到的System.InvalidCastException异常,核心是rddlCategory在Task页面类中是字段(无get/set访问器的成员变量),而Moq的SetupGet方法仅支持操作属性,内部反射逻辑尝试将字段元数据转为属性元数据时触发了类型转换失败。
可行解决方法
方案1:修改原页面代码,将字段封装为属性
把原Task类中protected internal RadDropDownList rddlCategory;的声明改为带访问器的属性:protected internal RadDropDownList rddlCategory { get; set; }修改后原有Mock代码不需要改动即可正常运行。
方案2:通过反射直接给字段赋值(无需修改原代码)
放弃使用Moq的Setup方法,直接用反射为Mock生成的Task实例的字段赋值,示例代码如下:var mockView = new Mock<Task>(); var taskInstance = mockView.Object; // 反射查找字段并赋值 typeof(Task) .GetField("rddlCategory", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) .SetValue(taskInstance, dropdown.Object);方案3:使用高版本Moq的SetField扩展方法
如果你使用的Moq版本≥4.16,可以直接调用Moq内置的SetField方法完成字段赋值,代码更简洁:var mockView = new Mock<Task>(); mockView.SetField(x => x.rddlCategory, dropdown.Object);
额外注意事项
你要测试的rbCreateTask_Click方法中依赖Page.Validate()和Page.IsValid,测试前需要先对Page上下文的相关依赖做Mock或赋值,否则后续执行仍会触发空引用异常。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

