Json在单元测试中不被识别为对象

时间:2013-08-08 10:40:09

标签: c# asp.net-mvc-4 visual-studio-2012 nunit json.net

您好我在我的MVC控制器中返回一个JsonResult,我想对返回的结果进行单元测试。 我的控制器代码如下

        return Json(new
        {
            error,
            viewModel,
            contextId = viewModel.ContextId
        });

我的单元测试代码是

        var expectedJson = Json(new
        {
            error,
            viewModel,
            contextId = viewModel.ContextId
        });

我添加了nuget包JSon.Net& JSon-js json2都在我的Web包中。我不确定为什么这不起作用。

我的控制器的使用指令是

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Ionic.Zip;
using ReferenceData.Web.Services;
using ReferenceData.Web.ViewModels;

和我的单元测试的using指令是

using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.Mvc;
using Moq;
using NUnit.Framework;

controller方法返回一个JsonResult。在我的单元测试中,我正在尝试创建一个可以与JsonResult.Data进行比较的对象。

// act
JsonResult response = controller.doSomething()
// assert
Assert.AreEqual(response.data, expectedJson)

希望这只是新鲜眼睛会帮助的事情之一。我刚开始使用Json,原来的控制器是由其他人编写的,我只是在测试它。

4 个答案:

答案 0 :(得分:0)

您想在单元测试中使用JsonResult下注。

JsonResult result = controller.ReturnSomeJson() as JsonResult;

请参阅this文章。

答案 1 :(得分:0)

如果您使用的是Assert.AreEqual,则应覆盖Equal来比较对象:Unit Test Assert.AreEqual failed

答案 2 :(得分:0)

好的,我的错误是使用

Var x = Json(new ...

在我的测试中,我应该像这样宣布它

        var expectedJson = new
        {
            error,
            viewModel,
            contextId = viewModel.ContextId
        };

Json是一种从Controller继承的方法,这就是为什么它在单元测试中不起作用的原因。然后,为了获得对JsonResult.data中元素的访问,我做了这个

dynamic response = controller.doSomething() as dynamic;

通过使用动态,它可以让我访问Json中的元素,我可以直接测试它们。这仍然不完全正常,但我不确定我的测试或我正在测试的代码是否有问题

答案 3 :(得分:0)

执行此操作的最佳方法是在返回匿名类型时使用反射。

var result = this.Controller.Method() as JsonResult;

var viewmodel = result.Data.GetType().Getproperty("viewModel").GetValue(result.Data,null);    

Assert.AreEqual(viewmodel, expectedviewmodelValue);

注意:调试并查看result内的内容,通过放置BreakPoint,当点击时,选择“结果”,右键单击,选择“Quick Watch”。展开到result.Data。查看里面的value属性和类型。然后修改.GetProperty("HERE")。 我不确定return JSON(...)是什么,但return JsonResult是常用的。