Как бросить и получить объект исключения в MoQ WebAPI

У меня есть OData с поддержкой WebAPI, который содержит

  1. TestController: он содержит один метод настраиваемого действия.
  2. WebApiExceptionHandler: пользовательский обработчик исключений в WebApi, зарегистрированный в WebApiConfig.cs.
  3. ITestManager: интерфейс
  4. 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 метод.

Другие вопросы по тегам