Перенос пользовательского модульного теста атрибутов фильтра из .NET Framework в .NET Core 2.1 - PullRequest
0 голосов
/ 09 января 2019

У меня есть приложение .NET Framework 4.7.2 MVC, которое я перевожу на приложение .NET Core 2.1. Пока все работает, но я не могу получить один из модульных тестов, который тестировал собственный атрибут, который я написал, работая в .NET Core версии.

Это код для теста атрибутов в версии Framework

    private HttpActionContext _successContext;
    private HttpActionContext _failContext;
    private HttpControllerContext _controllerContext;

    [TestInitialize]
    public void Initialize()
    {
        _controllerContext = new HttpControllerContext
        {
            Request = new HttpRequestMessage(HttpMethod.Post, string.Empty)
            {
                Content = new ObjectContent(typeof(string), string.Empty, new JsonMediaTypeFormatter())
            }
        };

        _successContext = new HttpActionContext {ControllerContext = _controllerContext};
        _successContext.ModelState.Add("TestField", new ModelState());

        _failContext = new HttpActionContext { ControllerContext = _controllerContext };
        _failContext.ModelState.Add("TestField", new ModelState());
        _failContext.ModelState.AddModelError("TestField", "Test error message");

    }

Как правильно добавить HttpControllerContext и ActionContext в версию .NET Core?

Или это неправильный подход для проверки атрибута в .NET Core?

Это версия атрибута Frameowrk, которая тестируется

public class JsonValidationFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ModelState.IsValid) return;
        var errorMessages = actionContext.ModelState.Values
            .SelectMany(modelState => modelState.Errors.Select(x => x.ErrorMessage));
        actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, Json.Encode(errorMessages));
    }
}

Вот как я разработал этот атрибут в версии .NET Core (он работает, как и ожидалось, но мне просто нужно повторно реализовать Unit Test для него.

public class JsonValidationFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext actionContext)
    {
        if (actionContext.ModelState.IsValid) return;
        IEnumerable<string> errorMessages = actionContext.ModelState.Values.SelectMany(modelState => modelState.Errors.Select(x => x.ErrorMessage));
        actionContext.Result = new BadRequestObjectResult(errorMessages);
    }
}

1 Ответ

0 голосов
/ 09 января 2019

Учитывая версию атрибута .Net Core, вам действительно нужен ActionExecutingContext для проверки атрибута

Например

// Arrange
var context = new ActionExecutingContext(
    new ActionContext
    {
        HttpContext = new DefaultHttpContext(),
        RouteData = new RouteData(),
        ActionDescriptor = new ActionDescriptor()
    },
    new List<IFilterMetadata>(),
    new Dictionary<string, object>(),
    new object());

context.ModelState.AddModelError("TestField", "Test error message");

var filter = new JsonValidationFilterAttribute();

// Act
filter.OnActionExecuting(context);

// Assert
Assert.IsInstanceOfType(context.Result, typeof(BadRequestObjectResult));
//context.Result.Should().BeOfType<BadRequestObjectResult>(); Fluent Assertions
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...