Moq是静态类中的静态方法

Kut*_*ith 14 moq

 public Product GetbyID(int id)
    {            
            try
            {
               //mycode Product p=..........

            }
            catch (DataAccessException ex)
            {
                throw new BusinessException(ex.ErrorCode);
            }
            catch (Exception ex)
            {
                BusinessExceptionHandler.LogException(ex);
            }

        return p;
    }
Run Code Online (Sandbox Code Playgroud)

上面给出了我需要编写测试用例的代码片段.这里LogException(ex); 是静态类BusinessExceptionHandler中的静态方法

我参考了Moq框架工作2.6.1014.1

我怎么能用Moq方法BusinessExceptionHandler.LogException

我更喜欢一种不需要对方法GetbyID进行任何更改的模拟机制

Bla*_*asp 18

Moq不允许模拟静态方法,因此您可能需要更改静态方法的工作.一种选择是让静态方法调用依赖项的实例方法.因此,您将使用Log方法创建"Logger"类,并将静态Logger字段/属性(BusinessExceptionHandler.Logger)添加到静态类.在实际场景中,您可以使用标准Logger实例填充BusinessExceptionHandler.Logger,并将其用作Singleton.为了测试,将一个Mock注入到BusinessExceptionHandler.Logger中并设置您的期望并验证模拟.


man*_*lds 8

Moq(和NMock,RhinoMock)在这里不会帮到你.您必须围绕LogException创建一个包装类(和虚方法),并在生产代码中使用它并使用它进行测试.

或者你可以使用像TypeMock,Microsoft.Fakes等工具(http://stacktoheap.com/blog/2012/11/11/testing-extension-methods-with-microsoft-fakes/),如果你绝对无法改变你现有的码.


Mon*_*sto 5

这是我解决问题的方法。假设这是您要进行单元测试的类:

 public static class TaskFactory
 {
   public static T CreateTask<T>(long workRequestId, ProcessTriggerType workRequestType)
   {
     var task = some code to do the work;
     return (T)task;
   }
 }
Run Code Online (Sandbox Code Playgroud)

创建一个接口和一个实现它的包装类:

public interface ITaskFactoryFacade
  {
    T CreateTask<T>(long workRequestId, ProcessTriggerType workRequestType);
  }

  public class TaskFactoryFacade : ITaskFactoryFacade
  {
    public T CreateTask<T>(long workRequestId, ProcessTriggerType workRequestType)
    {
      return TaskFactory.CreateTask<T>(workRequestId, workRequestType);
    }
  }
Run Code Online (Sandbox Code Playgroud)

现在模拟这个类:

var taskFactoryFacadeMock = new Mock<ITaskFactoryFacade>();
taskFactoryFacadeMock.Setup(t => t.CreateTask<SomeTask>(It.IsAny<long>(), It.IsAny<SomeType>())).Returns(new SomeTask());
Run Code Online (Sandbox Code Playgroud)

墨青快乐。