C#单元测试时覆盖类依赖项的最佳方法是什么?
问题解答
为什么你的子类写法没有覆盖父类属性
C#的继承机制中,只有父类标记了virtual的成员,子类用override声明的同名成员才会触发多态覆盖。你之前没有加override的几种同名成员写法,本质是成员隐藏,仅当你把实例明确当作TestSettings类型调用时才会走子类实现,一旦你将实例作为ISettings或父类Settings类型传入被测类,运行时会直接调用父类的实现,所以会触发网络请求逻辑报错。
另外属性本质是编译器生成的get_XXX()/set_XXX()方法,字段是普通类成员变量,二者类型完全不同,自然不能用字段去重写属性,这也是你遇到CS0106报错的原因。
单元测试覆盖依赖的正确方案
优先选择直接实现ISettings接口,完全不需要继承原有Settings类,这是最合理的方案,不需要修改任何生产代码,也不会和原有实现的外部逻辑耦合。
示例实现
// 测试用实现直接依赖接口,和原有Settings类完全无关 public class TestSettings : ISettings { // 可自由配置,满足不同测试场景的取值需求 public bool IsFooEnabled { get; set; } }
测试调用代码
public void Test() { TestSettings testSettings = new TestSettings(); testSettings.IsFooEnabled = true; SomeObject someObject = new SomeObject(testSettings); // 后续测试逻辑 }
方案优势
- 完全不入侵生产代码:不需要给原有
Settings类加virtual修饰符,避免为了测试修改生产逻辑 - 彻底解耦外部依赖:不会意外触发原有实现的网络请求等副作用
- 灵活性更高:可以根据测试需求自由扩展测试实现的逻辑,不受父类限制
- 符合面向对象设计原则:本身
ISettings就是抽象依赖,测试只需要依赖抽象不需要绑定具体生产实现
内容的提问来源于stack exchange,提问作者ohhayitskay
相关产品推荐
相关产品推荐

