我有一个启用 OData 的 WebAPI,其中包含
- TestController:它包含一个自定义操作方法。
- WebApiExceptionHandler:WebApi中的自定义异常处理程序,注册在WebApiConfig.cs中。
- ITestManager:接口
TestManager:实现 ITestManager 的类。此类处理数据的所有业务逻辑。WebAPI 控制器 TestController 有一个调用这个类的函数。
此外,还有一个使用 MoQ 框架进行测试的 TestWebAPI 项目。TestMethod "Test_UpdatePackageVendorOnException__Success" 使用 MoQ 设置在 UpdateTestQuantity 方法中抛出异常。但是我调试这个测试方法的时候,抛出异常的时候,调试器并没有指向WebApiExceptionHandler类。理想情况下,API 中发生的所有异常都在 WebApiExceptionHandler 类中处理
我面临的问题是,在我的测试方法中,我想对 WebApiExceptionHandler 返回的异常对象进行测试。但是由于控件永远不会进入 WebApiExceptionHandler,所以我不能这样做。
如何修改代码,以便在 TestMethod 中测试 WebApiExceptionHandler 返回的自定义对象。
WebAPI 代码:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Services.Replace(typeof(IExceptionHandler), new WebApiExceptionHandler());
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApiGetParam",
routeTemplate: "api/{controller}/{key}/{count}",
defaults: new { key = RouteParameter.Optional, count = RouteParameter.Optional }
);
}
}
public class WebApiExceptionHandler : ExceptionHandler
{
public WebApiExceptionHandler()
{
}
public override void Handle(ExceptionHandlerContext context)
{
try
{
var objCustomException = new CustomException(context.Exception);
context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError, objCustomException);
}
catch (Exception)
{
base.Handle(context);
}
}
public override bool ShouldHandle(ExceptionHandlerContext context)
{
return true;
}
}
public interface ITestManager
{
bool UpdateTestQuantity();
}
public class TestManager : ITestManager
{
public TestManager()
{
}
public bool UpdateTestQuantity()
{
//Custom Logic
return true;
}
}
public class TestController : ODataController
{
ITestManager testManager;
public TestController()
{
testManager = new TestManager();
}
public TestController(ITestManager iTestManager)
{
testManager = iTestManager;
}
public IHttpActionResult UpdateTestQuantity(ODataActionParameters param)
{
bool result = testManager.UpdateTestQuantity();
return Ok();
}
}
WebApiTest 项目
[TestClass]
public class TestControllerTest
{
Mock<ITestManager> iTestManagerMock;
TestController objTestController;
[TestInitialize]
public void Setup()
{
iTestManagerMock = new Mock<ITestManager>();
}
[TestMethod]
[ExpectedException(typeof(Exception), AllowDerivedTypes = true)]
public void Test_UpdateTestQuantityOnException__Success()
{
iTestManagerMock.Setup(i => i.UpdateTestQuantity().Throws(new Exception());
objTestController = new TestController(iTestManagerMock.Object);
var objODataActionParameters = new ODataActionParameters();
objTestController.Request = new HttpRequestMessage();
objTestController.Configuration = new HttpConfiguration();
IHttpActionResult objIHttpActionResult = objTestController.UpdateTestQuantity(objODataActionParameters);
//Problem Area
//Control never reaches here after the exception is thrown
//Want to check some property of exception object returned via Exception WebApiExceptionHandler
}
[TestCleanup]
public void Clean()
{
iTestManagerMock = null;
}
}