在ASP.NET MVC中进行测试时如何访问JsonResult数据

jua*_*elx 11 c# json unit-testing asp.net-mvc-3

我在C#mvc控制器中有这个代码:

[HttpPost]
    public ActionResult Delete(string runId)
    {
        if (runId == "" || runId == null)
        {
            return this.Json(new { error = "Null or empty params" });
        }
        try
        {
            int userId = (int)Session["UserId"];
            int run = Convert.ToInt32(runId);

            CloudMgr cloud = new CloudMgr(Session);
            cloud.DeleteRun(userId, run);

            return this.Json(new { success = true });
        }
        catch (Exception ex)
        {
            return this.Json(new { error = ex.ToString() });
        }
    }
Run Code Online (Sandbox Code Playgroud)

如何在ControllerTest中访问我的Json"错误"字段以检查它是否为空?

[TestMethod]
    public void DeleteWrongParam()
    {
        WhatIfController controller = new WhatIfController();
        controller.ControllerContext = 
        TestUtils.CreateMockSessionControllerContext().Object as ControllerContext;

        JsonResult result = controller.DeleteWhatIf(null) as JsonResult;
Run Code Online (Sandbox Code Playgroud)

Assert.IsNotNull(result.Data.error);是我想做的.有任何想法吗?谢谢.

tta*_*mpu 23

JavaScriptSerializer适用于字符串和静态类型.在这里,您创建了匿名类型为Json(new {success = true}).这种情况下,你最好使用动态类型.

JsonResult result = controller.DeleteWhatIf(null) as JsonResult;
dynamic dresult = result.Data;
Assert.IsTrue(dresult.succes);
Run Code Online (Sandbox Code Playgroud)

您需要导入Microsoft.CSharp dll来测试项目.

如果测试和控制器在不同的组件中,则需要使测试组件成为控制器组件的"朋友"组件,如下所示:

[assembly:InternalsVisibleTo("testproject assembly name")]

  • 它引发了一个例外:'对象'不包含'成功'定义....任何想法?谢谢 (3认同)
  • 你可以把它变得更容易`dynamic result = controller.DeleteWhatIf(null)as JsonResult; Assert.IsNotNull(result.Data.error);`=) (2认同)

Dev*_*esh 19

你可以像这样使用 - 结果将是预期的对象定义.因此,如果成功,您的成功标志将为TRUE,否则为false,如果为false,则您应该期望将使用错误消息更新error属性.

        JsonResult jsonResult = oemController.List() as JsonResult;
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        Result result = serializer.Deserialize<Result>(serializer.Serialize(jsonResult.Data));

        public class Result 
        {
            public bool success ;
            public string error;
        }
Run Code Online (Sandbox Code Playgroud)