C# 如何在类中模拟两个依赖的方法

C# 如何在类中模拟两个依赖的方法,c#,unit-testing,mocking,moq,C#,Unit Testing,Mocking,Moq,我想测试乘法。但要测试乘法的方法,求和法需要模仿。如何使用模拟求和法?有可能是这样的吗?我会独立测试Sum,对于乘法测试,我会假设Sum是有效的。如果它适用于求和测试,那么它也适用于乘法测试。此外,有些人认为乘法运算的原理不应该被测试所知。如果以后有一个不同的不依赖于Sum的算法,该怎么办?您不模拟正在测试的类,而是模拟它所依赖的类 如果确实希望能够独立于Sum()方法测试乘法()方法,则必须将其分离到自己的接口中,并向示例类提供该接口的实例,该实例可用于执行Sum 另一种方法是首先简单地测试S

我想测试乘法。但要测试乘法的方法,求和法需要模仿。如何使用模拟求和法?有可能是这样的吗?

我会独立测试Sum,对于乘法测试,我会假设Sum是有效的。如果它适用于求和测试,那么它也适用于乘法测试。此外,有些人认为乘法运算的原理不应该被测试所知。如果以后有一个不同的不依赖于Sum的算法,该怎么办?

您不模拟正在测试的类,而是模拟它所依赖的类

如果确实希望能够独立于Sum()方法测试乘法()方法,则必须将其分离到自己的接口中,并向示例类提供该接口的实例,该实例可用于执行Sum


另一种方法是首先简单地测试Sum()方法。如果Sum()方法通过了所有测试,则可以合理地确定它工作正常。一旦您知道它工作正确,可以通过测试乘法()方法来构建知识。

我使用的唯一工具可能完成您所说的是。如果你使用最小起订量,这是无法做到的。但是,无论哪种方式,我都建议将您的类作为一个单元进行测试。也就是说,如果您已经为Sum()编写了测试,并且对其行为感到满意,请继续为multipsition()编写测试,如果它们暴露了问题,请在Sum()或乘法中修复它们,根据需要。

不要试图在
乘法中“模拟”调用
Sum
,您只需单独测试它,因为调用
Sum
是一个实现细节。但是,如果您的实际代码稍微复杂一些,您可以添加一个重载,该重载使用
Func

interface ISample
{
    int Sum(int a,int b);
    int Multiplication(int x,int a,int b);
}

class Sample
{
    public int Sum(int a,int b)
    {
        return a+b;
    }

    public int Multiplication(int x,int a,int b)
   {
       return x*Sum(a,b);
   }
}
公共整数乘法(整数x,整数a,整数b)
{
返回这个。乘法(x,a,b,(a,b)=>a+b);
}
公共整数乘法(整数x,整数a,整数b,Func-sumFunc)
{
返回x*sumFunc(a,b);
}
然后,您可以在测试中提供自己的
sumFunc
实例


或者,您可以将
Sum
设置为虚拟,并在您的测试方法中覆盖它,要求用您自己的实现替换它。

另一个建议是显式实现接口-然后您必须引入可以为每个方法共享和测试的私有函数

public int Multiplication(int x,int a,int b)
{
    return this.Multiplication(x, a, b, (a, b) => a + b);
}

public int Multiplication(int x,int a,int b, Func<int, int, int> sumFunc)
{
    return x * sumFunc(a, b);
}

正如其他人所说,您可以使用单独的接口。比如说

private int Sum(int a, int b)
{
    return a+b;
}

int ISample.Sum(int a,int b)
{
    return Sum(a,b);
}

int ISample.Multiplication(int x,int a,int b)
{
   return x*Sum(a,b);
}
在测试代码中:

interface ISum{

   int Sum(int a, int b);
}

interface ISample
{
    int Multiplication(int x, int a, int b);
}

public class Sample : ISample
{
   ISum _sum;
    public Sample(ISum sum)
    {
      _sum = sum;
    }

   int Multiplication(int x, int a, int b)
   {
       return x*_sum.Sum(a,b);
   }
}
[TestFixture]
公共类测试样本
{
[测试]
公共void TestSample()
{
var mockSum=new Mock();
mockSum.Setup();//根据需要填写此内容
var sampleObj=新的sampleObj(mockSum.Object);
//做一些断言
}
}

你不需要模拟任何东西-模拟
ISample
只在依赖它的类中才需要。@Lee这里的方法有依赖关系。很好的答案,按照建议的替代方法-实际上不可能先测试某个东西(除非它是在同一个testmethod中完成的)-因为测试的执行顺序永远无法保证。是的,你在这一点上完全正确-我的意思是在写乘法测试之前,先写求和方法的测试。(当然,即使在这种情况下,Sum方法在理论上也有可能会失败,导致乘法测试失败,但至少你希望Sum测试也会失败)
[TestFixture]
public class TestSample
{
    [Test]
    public void TestSample()
    {
        var mockSum = new Mock<ISum>();
        mockSum.Setup(); // fill this what you want
        var sampleObj = new SampleObj(mockSum.Object);
        //Do Some Asserts
    }

}