您好我在我的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,原来的控制器是由其他人编写的,我只是在测试它。
答案 0 :(得分:0)
答案 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
是常用的。