【问题标题】:How to mocking method that calling static class using moq.mock in c#如何在 C# 中使用 moq.mock 模拟调用静态类的方法
【发布时间】:2012-08-31 22:11:34
【问题描述】:

假设我有以下代码:

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,但我不知道如何在我的情况下实现它

【问题讨论】:

    标签: c# unit-testing mocking moq


    【解决方案1】:

    您必须适当地设计代码才能利用起订量的优势。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-09-13
        • 2011-03-10
        • 2016-06-24
        • 1970-01-01
        • 2017-10-08
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        相关资源
        最近更新 更多