2

假设我有以下代码:

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;
    }
}

我想NumberSetupImplementation.IncreaseNumber在 c#.net 中使用 moq.mock 测试方法,我面临的问题是该方法正在调用静态方法。

我读过这个,但我不知道如何在我的情况下实现它

4

2 回答 2

1

您必须适当地设计您的代码以利用起订量的好处。

通常,这意味着广泛的 IoC 和应用程序的明确分离层。Moq 存在的主要原因是排除深度依赖关系,这样您就可以专注于测试独立于上下文创建的内容。有或没有起订量都是如此,它只是让它更容易一些。

于 2012-09-07T03:46:19.367 回答
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; 
    } 
}
于 2012-09-07T06:29:08.763 回答