Утверждение перенаправления на действие - PullRequest
0 голосов
/ 28 мая 2018

Как использовать ASP.Net Core 2 MVC и FluentAssertions.AspNetCore.Mvc, как утверждать, что контроллер перенаправлен на действие?

Например, при условии следующего действия контроллера:

public IActionResult SomeAction() {
  return RedirectToAction("SomeOtherAction");
}

Как мне написать тест, проверяющий перенаправление?

Я ищу что-то вроде:

[Fact]
public void SomeActionTest() {
  var controller = new SomeController();
  var result = controller.SomeAction();

  result.Should().BeRedirectedToRouteResult().WithAction("SomeOtherAction");
}

... за исключением того, что вместо BeRedirectedToRouteResult().WithAction("SomeOtherAction") яглядя утверждать что-то вроде BeRedirectedToAction("SomeOtherAction").

1 Ответ

0 голосов
/ 29 мая 2018

Лично я бы сделал что-то вроде следующего:

Создание static class, содержащего метод расширения и класс утверждения, который имеет метод с именем BeRedirectAction и может использоваться следующим образом:

    [Fact]
    public void ActionReturnsView_ExpectedRedirectToError_TypeMismatch()
    {
        var controller = new HomeController();

        var result = controller.Index();

        result.Should().BeRedirectAction(nameof(HomeController.Error));
    }

Метод расширения + класс подтверждения

Пример Статический класс

public static class ActionResultAssertionExtensions
{
    public class ActionResultAssertions : ObjectAssertions
    {
        public new IActionResult Subject { get; }

        public ActionResultAssertions(IActionResult subject) : base(subject)
        {
            Subject = subject;
        }

        [CustomAssertion]
        public void BeRedirectAction(string actionName, string because= null, params object[] becauseArgs)
        {
            var redirectResult = AssertionExtensions.Should(Subject).BeOfType<RedirectToActionResult>().Which;

            var actual = redirectResult.ActionName;
            var expected = actionName;

            Execute.Assertion.ForCondition(actual == expected)
                .BecauseOf(because, becauseArgs)
                .FailWith("Expected {context} to redirect to {0} Action but it is redirecting to {1}", expected, actual);
        }
    }

    public static ActionResultAssertions Should(this IActionResult subject)
    {
        return new ActionResultAssertions(subject);
    }
}

Образцы тестов

Тест несоответствия типов

Этопример сбоя, когда результатом не является перенаправление:

    [Fact]
    public void ActionReturnsView_ExpectedRedirectToError_TypeMismatch()
    {
        var controller = new HomeController();

        var result = controller.Index();

        result.Should().BeRedirectAction(nameof(HomeController.Error));
    }

Результат:

Expected type to be Microsoft.AspNetCore.Mvc.RedirectToActionResult, but found Microsoft.AspNetCore.Mvc.ViewResult.

Успешный тест

Это пример прохождения теста

    [Fact]
    public void ActionRedirectsToError_ExpectedRedirectToError_TestShouldPass()
    {
        var controller = new HomeController();

        var result = controller.RedirectToError();

        result.Should().BeRedirectAction(nameof(HomeController.Error));
    }

Тест другого действия

Это пример сбоя теста, когда он перенаправляется на другое действие:

    [Fact]
    public void ActionRedirectsToIndex_ExpectedRedirectToError_TestSHouldFailSayingDifferentActionName()
    {
        var controller = new HomeController();

        var result = controller.RedirectToIndex();

        result.Should().BeRedirectAction(nameof(HomeController.Error));
    }

Результат:

Ожидаетсярезультат для перенаправления на «Ошибка» Действие, но оно перенаправляет на «Индекс»Название действия.

...