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()方法时强制返回一个值。例如,强制抛出异常。

而且,我不能编辑代码,所以添加接口实现不是一个好的解决方案。

c#中方法的替换

要做到这一点,您必须传递到另一个类依赖于操作类。你可以用不同的方式做到这一点,其中之一是使用构造函数注入它,但首先你必须添加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(/*...*/);