Как бросить и получить объект исключения в MoQ WebAPI
У меня есть OData с поддержкой WebAPI, который содержит
- TestController: он содержит один метод настраиваемого действия.
- WebApiExceptionHandler: пользовательский обработчик исключений в WebApi, зарегистрированный в WebApiConfig.cs.
- ITestManager: интерфейс
TestManager: класс, реализующий ITestManager. Этот класс обрабатывает всю бизнес-логику для данных. Контроллер WebAPI TestController имеет единственную функцию, которая вызывает этот класс.
Кроме того, есть проект TestWebAPI, который использует MoQ Framework для тестирования. 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;
}
}
1 ответ
Удалить [ExpectedException]
атрибут метода тестирования (который нарушает принцип AAA) и переписать раздел assert вашего теста, чтобы использовать Assert.Throws
NUnit метод.