【问题标题】:Asserting Redirect to Action断言重定向到操作
【发布时间】:2018-11-07 10:05:22
【问题描述】:

当使用 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") 之外,我正在寻找类似 @​​987654324@ 的断言。

【问题讨论】:

  • 您必须自己创建。

标签: asp.net-core fluent-assertions


【解决方案1】:

我个人会做以下事情:

创建一个包含扩展方法和断言类的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));
    }

结果:

重定向到“错误”操作的预期结果,但它正在重定向到“索引”

注意

以上内容不测试控制器/区域差异或任何其他可能的组合,它只是查看操作名称。

【讨论】:

  • 谢谢,米哈尔!你会考虑将此作为拉取请求提交给 FluentAssertions 吗?
  • @BenGribaudo 这是一个特定于框架(ASP.NET Core 2.0)的断言,所以绝对不属于标准 FA 存储库,也许值得拥有另一个专门为 ASP.NET Core 2.0 提供这些扩展的存储库(如果还没有)
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2023-03-03
相关资源
最近更新 更多