断言重定向到操作
Posted
技术标签:
【中文标题】断言重定向到操作【英文标题】: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@ 的断言。
【问题讨论】:
您必须自己创建。 【参考方案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 提供这些扩展的存储库(如果还没有) 可以提交给github.com/fluentassertions/fluentassertions.aspnetcore.mvc吗?以上是关于断言重定向到操作的主要内容,如果未能解决你的问题,请参考以下文章