繁体   English   中英

如何测试 mvc 控制器的状态代码

[英]how to test mvc controller for status code

我正在为我的控制器使用本机 .net Visual Studio 测试工具。 试图确保此时(代码的最开始)如果传递给控制器​​的内容未通过授权,我将获得一个未经授权的状态代码集。 这是我的控制器代码。

public class HubspotController : Controller
{
    [HttpPost]
    public ActionResult FreeDemo(string json)
    {
        JObject jobject = JObject.Parse(json);

        var password = jobject["person"]["password"]?.ToString();
        var username = jobject["person"]["username"]?.ToString();

        if (!AuthorizeUser(password, username))
        {
            StatusUnauthorized();
        }

        var resultStatus = new ResultStatus { Message = "success"};
        return Json(resultStatus, JsonRequestBehavior.AllowGet);
    }

    public ActionResult StatusUnauthorized()
    {
        return new HttpStatusCodeResult((int)HttpStatusCode.Unauthorized, "Unauthorized");
    }

    private bool AuthorizeUser(string password, string username)
    {
        return false;
    }
}

这是我的测试。 忍受我,我没有太多的测试经验,所以只是想弄清楚这一点。

[TestClass]
public class HubspotControllerFixture
{
    private Mock<HttpRequestBase> request;
    private Mock<HttpContextBase> httpContext;
    private Mock<HttpResponseBase> response;

    [TestInitialize]
    public void TestInitialize()
    {
        request = new Mock<HttpRequestBase>();
        request.SetupGet(r => r.ContentType).Returns("application/json");
        response = new Mock<HttpResponseBase>();
        httpContext = new Mock<HttpContextBase>();
        httpContext.SetupGet(c => c.Request).Returns(request.Object);
        httpContext.SetupGet(x => x.Response).Returns(response.Object);
    }

    [TestMethod]
    public void Status_Code_Gets_Set_To_Unauthorized()
    {
        var json = "{\"person\": {\"password\":\"abc123\", \"username\":\"user\", \"name\":\"test person\"}}";
        var controller = new HubspotController()
        {
            ControllerContext = new ControllerContext()
            {
                HttpContext = httpContext.Object
            }
        };
        controller.FreeDemo(json);
        Assert.AreEqual(HttpStatusCode.Unauthorized, httpContext.Object.Response.StatusCode);
    }
}

当我运行它时,我收到错误。 我究竟做错了什么?

Assert.AreEqual 失败。 预期: <Unauthorized (System.Net.HttpStatusCode)> 实际: <0 (System.Int32)>

您在测试中断言了错误的对象。 此测试用例对 HttpContext 没有影响或依赖。 您可能想要断言被测方法的结果。

您首先需要更新您的目标控制器操作。

//...other code omitted for brevity
if (!AuthorizeUser(password, username))
{
    return StatusUnauthorized();
} 
//...other code omitted for brevity

你的测试现在看起来像这样,因为你实际上不需要这个测试用例的模拟 HttpContext

[TestMethod]
public void Status_Code_Gets_Set_To_Unauthorized() {
    //Arrange
    var json = "{\"person\": {\"password\":\"abc123\", \"username\":\"user\", \"name\":\"test person\"}}";
    var controller = new HubspotController();
    var expected = (int)HttpStatusCode.Unauthorized;
    //Act
    var actionResult = controller.FreeDemo(json) as HttpStatusCodeResult;
    //Assert
    Assert.IsNotNull(actionResult);
    Assert.AreEqual(expected, actionResult.StatusCode);
}

我认为您缺少 return 语句。 请参阅下面的更新代码。

public class HubspotController : Controller
{
    [HttpPost]
    public ActionResult FreeDemo(string json)
    {
        JObject jobject = JObject.Parse(json);

        var password = jobject["person"]["password"]?.ToString();
        var username = jobject["person"]["username"]?.ToString();

        if (!AuthorizeUser(password, username))
        {
            return StatusUnauthorized();
        }

        var resultStatus = new ResultStatus { Message = "success"};
        return Json(resultStatus, JsonRequestBehavior.AllowGet);
    }

    public ActionResult StatusUnauthorized()
    {
        return new HttpStatusCodeResult((int)HttpStatusCode.Unauthorized, "Unauthorized");
    }

    private bool AuthorizeUser(string password, string username)
    {
        return false;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM