You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:44:20