如何在ASP.NET MVC3网站上对我的Json结果进行单元测试?

Pur*_*ome 10 .net c# asp.net-mvc unit-testing

我正在尝试测试Data从a返回的值ASP.NET MVC3 JsonView,但我不确定如何.


我有一个简单的ASP.NET MVC3网站,带有一个返回JsonView的动作方法.

例如(一些匿名类型列表的pseduo代码):

var lotsOfFail = database.GetMeThatDamnDataList();
var returnData = (from x in lotsOfFail
                  select new
                  {
                      Id = x.Id,
                      Name = x.Name
                      ..
                   }).ToList();
return Json(returnData, JsonRequestBehavior.AllowGet);
Run Code Online (Sandbox Code Playgroud)

现在在我的单元测试中,我正在尝试测试它的值Data.因此,根据各种建议,我正在做以下工作..哪些 - 工作: -

// Act.
JsonResult jsonResult = controller.PewPewKThxBai(null, null);

// Assert.    
Assert.IsNotNull(jsonResult);
dynamic data = jsonResult.Data;
Assert.IsNotNull(data);
Assert.IsTrue(data.Count >= 0);
Run Code Online (Sandbox Code Playgroud)

但我还希望测试返回的前三个结果,对照固定的数据列表.

请注意我如何使用以下代码:var lotsOfFail = database.GetMeThatDamnDataList(); 嗯,数据库中填充了一些硬编码数据和一些随机数据.前三个记录是硬编码的.

因此,我希望确保我可以测试我的硬编码数据.

像这样...

// Assert.    
Assert.IsNotNull(jsonResult);
dynamic data = jsonResult.Data;
Assert.IsNotNull(data);

var hardCodedData =
    FakeWhatevers.CreateHardcodedWhatevers()
    .Where(x => x.EventType == EventType.BannableViolation)
    .ToList();
Assert.IsTrue(data.Count >= hardCodedData .Count);

for (int i = 0; i < hardCodedData .Count; i++)
{
    Assert.AreEqual(data[0].Id== hardCodedData [0].GameServerId);
}
Run Code Online (Sandbox Code Playgroud)

但因为data是动态的,我不知道如何测试它的属性.

有任何想法吗?

Dar*_*rov 9

以下应该有效:

for (int i = 0; i < hardCodedData.Count; i++)
{
    Assert.AreEqual(hardCodedData[i].GameServerId, data[i].Id);
    Assert.AreEqual(hardCodedData[i].GameServerName, data[i].Name);
    ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已经颠倒了参数的顺序,因为第一个是预期的,第二个是实际的.

  • @ Pure.Krome,订购不会产生任何影响.这只是惯例.因此,当您的单元测试失败时,您会收到一条有意义的消息:`expected:1,actual:2`.如果在测试失败时将参数置于错误的顺序,那么当我的hardCodedData包含2时,你会想知道为什么在地球上你期望1. (2认同)