如何在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
相关产品推荐
相关产品推荐

