如何在C#中Mock包含多属性关联的代码行?
在C#中Mock多层嵌套属性的正确姿势
嘿,我来帮你解决这个Mock嵌套属性的问题!看你代码里是要Mock ExternalEntities → Reflection → VM 这一层层的嵌套属性对吧?用Moq(你代码里用的就是Moq的Mock类)其实很容易实现,我给你梳理清楚步骤,顺便修正你代码里的小拼写错误:
首先先提几个细节坑:Reflcation/Reflaction应该是Reflection,Moq的属性返回方法是Returns不是Return,还有变量名m_reflectio...少了字母,这些小错误别踩!
下面是完整的可运行测试代码示例:
// 先确保接口定义正确(每个层级的属性都要在接口里声明) public interface IExternalEntities { IReflection Reflection { get; } } public interface IReflection { IVm VM { get; } } public interface IVm { // 根据你的IsVmPowerOn逻辑定义需要的属性/方法 bool IsPoweredOn { get; } } // 修正后的VM类(调整访问修饰符和拼写) public class VM { private IVm MyVm; public VM(IExternalEntities externalEntities) { MyVm = externalEntities.Reflection.VM; } public bool IsVmPowerOn() { // 示例逻辑:返回MyVm的开机状态 return MyVm?.IsPoweredOn ?? false; } } [TestMethod] public void TestVM() { // 1. 创建各个层级的Mock实例 var m_externalEntities = new Mock<IExternalEntities>(); var m_reflection = new Mock<IReflection>(); var m_vm = new Mock<IVm>(); // 2. 先设置最内层VM的行为(根据你的测试需求自定义) m_vm.Setup(v => v.IsPoweredOn).Returns(true); // 3. 把VM Mock关联到Reflection的VM属性 m_reflection.Setup(x => x.VM).Returns(m_vm.Object); // 4. 把Reflection Mock关联到ExternalEntities的Reflection属性 m_externalEntities.Setup(x => x.Reflection).Returns(m_reflection.Object); // 5. 实例化要测试的VM类,传入Mock的依赖 var vmUnderTest = new VM(m_externalEntities.Object); // 6. 执行测试并断言结果 var result = vmUnderTest.IsVmPowerOn(); Assert.IsTrue(result); // 可选:验证属性是否被正确访问过 m_externalEntities.Verify(x => x.Reflection, Times.Once); m_reflection.Verify(x => x.VM, Times.Once); }
关键要点:
- 从内到外设置Mock:先搞定最底层的
IVm,再逐层往上关联到IReflection和IExternalEntities,这样嵌套属性的调用链就完全通了。 - 接口定义要完整:每个层级的属性都必须在对应的接口里声明,Moq才能Mock这些属性的访问行为。
- 用
Returns返回Mock对象:Moq里设置属性返回值的方法是Returns,别写成Return了。 - 可选验证逻辑:如果需要确认代码确实访问了这些嵌套属性,可以用
Verify方法检查访问次数,确保调用流程符合预期。
内容的提问来源于stack exchange,提问作者Yossich
相关产品推荐
相关产品推荐

