gpt4 book ai didi

C# Moq 拦截方法调用

转载 作者:行者123 更新时间:2023-11-30 23:03:12 25 4
gpt4 key购买 nike

我不确定我想做的事情是否可行。我有一个看起来像这样的界面:

public interface IObject
{
void MethodA(ObjectA arg1);
void MethodB(ObjectB arg1, ObjectC arg2);
void MethodC(ObjectD arg1, ObjectE arg2);
}

我有类似以下实现的东西:

public class ObjectImplementation : IObject
{
public void MethodA(ObjectA arg1)
{
if(arg1.Something)
{
MethodB(new ObjectB(arg1), new ObjectC(arg1));
}
else
{
MethodC(new ObjectD(arg1), new ObjectE(arg1));
}
}
}

我正在尝试编写一个单元测试来测试对 methodB 或 methodC 的调用是否是根据我的条件进行的。如何实现这样的目标?

最佳答案

您正在尝试模拟一个接口(interface)并验证该接口(interface)的实现。

您可以将方法 C 和 D 设为虚拟方法,并在模拟中使用该实现。

实现:

public class ObjectImplementation : IObject
{
public void MethodA(ObjectA arg1)
{
if (arg1.Something)
{
MethodB(new ObjectB(arg1), new ObjectC(arg1));
}
else
{
MethodC(new ObjectD(arg1), new ObjectE(arg1));
}
}

public virtual void MethodB(ObjectB arg1, ObjectC arg2)
{

}

public virtual void MethodC(ObjectD arg1, ObjectE arg2)
{

}
}

测试:

[Fact]
public void Test_WhenSomethingIsTrue_MethodB_Invoked_WithObjects_B_And_C()
{
// Arrange
Mock<ObjectImplementation> mockObject = new Mock<ObjectImplementation>();
ObjectA arg = new ObjectA();
arg.Something = true;

// Act
mockObject.Object.MethodA(arg);

// Assert
mockObject.Verify(o => o.MethodB(It.Is<ObjectB>(b=> b.Arg == arg), It.Is<ObjectC>(c => c.Arg == arg)));
}

[Fact]
public void Test_WhenSomethingIsFalse_MethodC_Invoked_WithObjects_D_And_E()
{
// Arrange
Mock<ObjectImplementation> mockObject = new Mock<ObjectImplementation>();
ObjectA arg = new ObjectA();
arg.Something = false;

// Act
mockObject.Object.MethodA(arg);

// Assert
mockObject.Verify(o => o.MethodC(It.Is<ObjectD>(d => d.Arg == arg), It.Is<ObjectE>(e => e.Arg == arg)));
}

关于C# Moq 拦截方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com