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中并设置您的期望并验证模拟.
Moq(和NMock,RhinoMock)在这里不会帮到你.您必须围绕LogException创建一个包装类(和虚方法),并在生产代码中使用它并使用它进行测试.
或者你可以使用像TypeMock,Microsoft.Fakes等工具(http://stacktoheap.com/blog/2012/11/11/testing-extension-methods-with-microsoft-fakes/),如果你绝对无法改变你现有的码.
这是我解决问题的方法。假设这是您要进行单元测试的类:
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)
墨青快乐。