1

我有一个正在尝试进行单元测试的 MVC 控制器类。

具体的 ActionResult 是这样的

public ActionResult Create(Shipment newShipment)
{
   do some stuff to create a shipmentID
...
   return RedirectToAction("AddUnit",newShipment.ShipmentID);
}

我已经模拟了控制器上下文等,现在我想测试传递给 RedirectToAction 调用的 newShipment.ShipmentID 是我所期望的。

我有一个测试(在设置阶段有很多嘲笑)

    [Test]
    public void CreateSuccess()
    {
        //Arrange
        var shipment = new Shipment();
        shipment.Widgets = 2; //Make sure it a valid shipment otherwise
        //Act
        var result = controller.Create(shipment) as RedirectToRouteResult;
        //Assert
        Assert.IsNotNull(result);
        Assert.AreEqual("AddUnits", result.RouteValues["action"]);
        Assert.IsNull(result.RouteValues["controller"]);
        ...

现在我想找到一个 Assert 来检查我传递给 RedirectToAction 的 shippingID 是否正确。我如何检索它的值?

(我相信这段代码确实有效(即实际视图得到正确的shipmentID),但我想编写一个单元测试)。

4

2 回答 2

3

实际上, RedirectToActions 可以带参数;下面是我如何在一个中测试正确参数的简化示例。我在这里使用 NUnit 和 FluentAssertions。

[HttpPost]        
public ActionResult RedirectMethod()
{
     return RedirectToAction("Index", "Home", new { parameter = "Value" });
}

然后是测试:

[Test]
public void RedirectSetsExpectedParameters()
{
    var result = controller.RedirectMethod();
    var redirectResult = result.As<RedirectToRouteResult>();

    var expectedRedirectValues = new RouteValueDictionary
        {
            { "parameter", "Value" },
            { "action", "Index" },
            { "controller", "Home" }
        };

    redirectResult
       .RouteValues
       .ShouldBeEquivalentTo(expectedRedirectValues, 
       "The redirect should look as I expect, including the parameters");
}
于 2016-07-13T15:55:13.587 回答
2

在这里,我给出了一个重定向到操作的示例

public ActionResult Signupsuccess(string account_code, string plan)
{
   ..........
  do some stuff

  return RedirectToAction("SubscriptionPlan", "Settings");

}

我已经模拟了控制器上下文并将一些参数传递给从控制器到测试方法的 RedirectToAction 调用。最后它测试了预期和实际

[测试方法()]

 public void SignupsuccessTest()
       {
            HomeController target = new HomeController(); // TODO: Initialize to an appropriate value
            string account_code = "B898YB7"; // TODO: Initialize to an appropriate value
            string plan = "Application-BASIC"; // TODO: Initialize to an appropriate value

            var ControllerContext = new Mock<ControllerContext>();
            var context = target.HttpContext;

            ControllerContext.SetupGet(p => p.HttpContext.Session["MerchantID"]).Returns("15");
            ControllerContext.SetupGet(p => p.HttpContext.Session["FriendlyIdentifier"]).Returns("3d649876-19f5-48d2-af03-ca89083ae712");

            target.ControllerContext = controllerContext.Object;       

            var action = (RedirectToRouteResult)target.Signupsuccess(account_code, plan);

            action.RouteValues["action"].Equals("SubscriptionPlan");
            action.RouteValues["controller"].Equals("Settings");

            Assert.AreEqual("SubscriptionPlan", action.RouteValues["action"]);
            Assert.AreEqual("Settings", action.RouteValues["controller"]);          
        }

我希望它对你有帮助。谢谢

于 2013-10-01T11:41:40.703 回答