说我有以下代码:
public class NumberClass
{
public NumberClass()
{
DefaultNumber = 1;
}
public int DefaultNumber{set;get;}
}
public static class NumberSetup
{
public static NumberClass GetDefaultNumber()
{
return new NumberClass();
}
}
public class NumberSetupImplementation
{
int FinalNumber;
public void IncreaseNumber(int currentNumber)
{
FinalNumber = currentNumber + NumberSetup.GetDefaultNumber().DefaultNumber;
}
}
我想在c#.net中使用moq.mock测试方法NumberSetupImplementation.IncreaseNumber
,我遇到的问题是该方法正在调用静态方法。
我已阅读this,但我不知道如何在我的案例中实施
答案 0 :(得分:1)
您必须适当地设计您的代码才能使用Moqs。
通常这意味着广泛的IoC并明确区分您的应用程序层。 Moq存在的主要原因是排除深度依赖性,因此您可以专注于独立于上下文测试您创建的内容。无论有没有Moq,它都会让它变得更容易。
答案 1 :(得分:1)
Moq使用动态代理,这就是为什么你不能使用Moq来模拟静态方法。为了设计可测试性,其中一个要点是避免使用静态方法。对于您的示例,您可以使用DI注入NumberSetup
或另一个技巧是使用两个构造函数:
public interface INumberSetup
{
NumberClass GetDefaultNumber();
}
public class NumberSetup: INumberSetup
{
public NumberClass GetDefaultNumber()
{
return new NumberClass();
}
}
public class NumberSetupImplementation
{
private int _finalNumber;
private INumberSetup _numberSetup;
public NumberSetupImplementation()
: this(new NumberSetup())
{}
public NumberSetupImplementation(INumberSetup numberSetup)
{
_numberSetup = numberSetup;
}
public void IncreaseNumber(int currentNumber)
{
_finalNumber = currentNumber + _numberSetup.GetDefaultNumber().DefaultNumber;
}
}