如何使用MoQ和NUnit在WebAPI 2中为ExceptionHandler编写单元测试

时间:2017-03-06 09:53:32

标签: c# unit-testing asp.net-web-api2 nunit moq

我有一个使用自定义ExceptionHandler来处理所有异常的WebAPI。我该如何对此CustomExceptionHandler进行单元测试。任何领导都会有所帮助

public class CustomExceptionHandler : ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {
        try
        {
            context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError, context.Exception));
        }
        catch (Exception)
        {
            base.Handle(context);
        }
    }

    public override bool ShouldHandle(ExceptionHandlerContext context)
    {
        return true;
    }
}

1 个答案:

答案 0 :(得分:6)

要对此自定义异常处理程序进行单元测试,请创建sut / mut所需的依赖项,并执行测试以验证预期的行为。

这是一个让你入门的简单例子。

[TestClass]
public class CustomExcpetionhandlerUnitTests {
    [TestMethod]
    public void ShouldHandleException() {
        //Arrange
        var sut = new CustomExceptionHandler();
        var exception = new Exception("Hello World");
        var catchblock = new ExceptionContextCatchBlock("webpi", true, false);
        var configuration = new HttpConfiguration();
        var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/api/test");
        request.SetConfiguration(configuration);
        var exceptionContext = new ExceptionContext(exception, catchblock, request);
        var context = new ExceptionHandlerContext(exceptionContext);

        Assert.IsNull(context.Result);

        //Act
        sut.Handle(context);

        //Assert
        Assert.IsNotNull(context.Result);
    }
}

对于上述测试,仅提供必要的依赖性以进行测试。被测方法(mut)对ExceptionHandlerContext有一个依赖关系。在将该类传递给mut之前,已经为它提供了该类的最小依赖性。

可以扩展断言以适应预期的行为。

由于所有依赖项都不是抽象的,因此Moq无法将它们包装起来。然而,这并没有阻止手动实例化所需的类。