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