Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用MoQ和NUnit为WebAPI 2中的ExceptionHandler编写单元测试_C#_Unit Testing_Asp.net Web Api2_Nunit_Moq - Fatal编程技术网

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

C# 如何使用MoQ和NUnit为WebAPI 2中的ExceptionHandler编写单元测试,c#,unit-testing,asp.net-web-api2,nunit,moq,C#,Unit Testing,Asp.net Web Api2,Nunit,Moq,我有一个WebAPI,它使用自定义的ExceptionHandler来处理所有异常。如何对此CustomExceptionHandler进行单元测试。任何线索都会有帮助 public class CustomExceptionHandler : ExceptionHandler { public override void Handle(ExceptionHandlerContext context) { try { con

我有一个WebAPI,它使用自定义的
ExceptionHandler
来处理所有异常。如何对此
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;
    }
}

要对该自定义异常处理程序进行单元测试,请创建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将无法包装它们。但是,这并没有停止手动实例化所需的类。

如果自定义ExceptionHandler类需要
RequestContext
对象,则还必须定义它:var exceptionContext=new exceptionContext(异常:异常,catchBlock:catchBlock,请求:request){RequestContext=newhttprequestcontext{Configuration=Configuration}};