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

如何在C#单元测试中调用void方法后测试属性值

单元测试void方法后属性值验证失败的问题解决

你的测试代码存在两个核心问题:

  • 仅通过mock.Setup(x => x.Calling())声明了方法的存在,但从未实际调用该方法,自然不会触发属性赋值逻辑。
  • 即便调用了Calling(),Moq生成的Mock对象默认不会执行接口的实际实现逻辑(也就是Demo类里的Name = "Calling"),因为Mock的作用是模拟依赖,而非复现真实类的行为。

方案1:直接测试真实类(推荐,适用于验证Demo类自身逻辑)

如果你的目标是验证Demo类中Calling()方法对Name属性的修改,不需要使用Mock,直接实例化真实类即可:

public class ClassTest
{
    [Fact]
    public void Demo_Calling_Test()
    {
        // 实例化真实Demo类
        var demo = new Demo();
        demo.Name = "test";
        Assert.Equal("test", demo.Name);
        
        // 实际调用Calling方法
        demo.Calling();
        
        // 验证属性值变化
        Assert.Equal("Calling", demo.Name);
    }
}

方案2:给Mock的Calling方法添加回调(适用于测试依赖IDemo的其他类)

如果你的测试场景是需要Mock IDemo来测试其他依赖它的类,需给Calling()的Setup添加回调逻辑,让Mock执行修改Name的操作:

public class ClassTest
{
    [Fact]
    public void Demo_Calling_Test()
    {
        var mock = new Mock<IDemo>();
        mock.SetupProperty(x => x.Name, "test");
        Assert.Equal("test", mock.Object.Name);
        
        // 给Calling方法设置回调,模拟真实逻辑修改Name
        mock.Setup(x => x.Calling())
            .Callback(() => mock.Object.Name = "Calling");
        
        // 必须调用Calling方法才会触发回调
        mock.Object.Calling();
        
        Assert.Equal("Calling", mock.Object.Name);
    }
}

内容的提问来源于stack exchange,提问作者Sri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:52:39