c#中方法的替换
本文关键字:替换 方法 | 更新日期: 2023-09-27 18:14:57
我正在尝试在我的c#单元测试程序中使用NSubstitution
我正在尝试对方法内部调用的方法进行替换。下面是一个例子:
public class operation
{
public int addition(int a, int b)
{
return (a + b);
}
}
public class anotherClass
{
public int increment(int ax, int bx)
{
operation loc = new operation();
ax = loc.addition(ax,bx);
return (ax + 1);
}
}
是否有可能在我的主函数中调用increment()方法并将替换应用于addition()方法?
我想在increment()方法中调用addition()方法时强制返回一个值。例如,强制抛出异常。
而且,我不能编辑代码,所以添加接口实现不是一个好的解决方案。
要做到这一点,您必须传递到另一个类依赖于操作类。你可以用不同的方式做到这一点,其中之一是使用构造函数注入它,但首先你必须添加IOperation接口,以便能够使用NSubstitute模拟它。示例代码如下所示:
public interface Ioperation
{
int addition(int a, int b);
}
public class operation : Ioperation
{
public int addition(int a, int b)
{
return (a + b);
}
}
public class anotherClass
{
Ioperation _operation;
public anotherClass(Ioperation operation)
{
_operation = operation;
}
public int increment(int ax, int bx)
{
operation loc = new operation();
ax = loc.addition(ax, bx);
return (ax + 1);
}
}
那么你可以在NSubstitute中模拟它,方法如下:
operation.addition(Arg.Any<int>(), Arg.Any<int>()).Throws(new Exception());
并通过构造函数
既然你在测试的方法(increment
)中创建了一个operation
的新实例,没有办法让nsubstitute代理你对addition
的调用-你最好(出于许多原因,其中之一是可测试性)使用控制反转来替代你的功能:
public interface IOperation
{
int addition(int a, int b);
}
public class operation : IOperation
{
public int addition(int a, int b)
{
return (a + b);
}
}
public class anotherClass
{
private readonly IOperation _operation;
public anotherClass(IOperation operation)
{
_operation = operation;
}
public int increment(int ax, int bx)
{
ax = _operation.addition(ax,bx);
return (ax + 1);
}
}
这样,您可以在运行应用程序时将operation
类的实例传递给anotherClass
,并在单元测试中通过NSubstitute.Substitute.For<IOperation>()
。然后,您可以使用该mock让它返回您想要的任何内容:
var mockOperation = NSubstitute.Substitute.For<IOperation>();
mockOperation.addition(Arg.Any<int>(), Arg.Any<int>()).Return(/*...*/);