如何在我的单元测试中获取返回的 JsonResult 中的数据?
How can I get to the data inside a returned JsonResult in my UnitTest?
我有一个控制器方法 returns Json这样的结果:
public ActionResult GetZipByState(string stateId)
{
var result =
_mediator.Send<List<ZipCodeModel>>(new ZipCodeByStateQuery()
{
StateId = stateId
});
return Json(new { ZipCodes = result }, JsonRequestBehavior.AllowGet);
}
然后我有这个单元测试:
[Fact]
public void GetZipByState_CanGetZipCodesByStateId()
{
// Arrange
_mockMediator.Setup(m => m.Send<List<ZipCodeModel>>(It.Is<ZipCodeByStateQuery>(plist => plist.StateId == "VA")))
.Returns(new List<ZipCodeModel>()
{
new ZipCodeModel(){ ZipCodeId = "7690", ZipCode = "24210" },
new ZipCodeModel(){ ZipCodeId = "7691", ZipCode = "24211" },
new ZipCodeModel(){ ZipCodeId = "7692", ZipCode = "24212" }
});
// Act
//var actual = _controller.GetZipByState("VA");
JsonResult actual = _controller.GetZipByState("VA") as JsonResult;
List<ZipCodeModel> result = actual.Data as List<ZipCodeModel>;
// Assert
Assert.Equal("24211", (dynamic)actual.Data);
}
我可以在我的 Json 下看到我需要获取的数据:
actual.Data.ZipCodes[1] 在此屏幕截图中:
但是当我尝试将 actual.Data 放入结果变量中然后执行断言时,它告诉我结果为空。
你应该怎么做?
您的问题是您正在转换为错误的类型。
这里是这一行:
List<ZipCodeModel> result = actual.Data as List<ZipCodeModel>;
应该改为
var result = actual.Data.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.FirstOrDefault(x => x.Name == "ZipCodes")
.GetValue(actual.Data) as List<ZipCodeModel>;
我有一个控制器方法 returns Json这样的结果:
public ActionResult GetZipByState(string stateId)
{
var result =
_mediator.Send<List<ZipCodeModel>>(new ZipCodeByStateQuery()
{
StateId = stateId
});
return Json(new { ZipCodes = result }, JsonRequestBehavior.AllowGet);
}
然后我有这个单元测试:
[Fact]
public void GetZipByState_CanGetZipCodesByStateId()
{
// Arrange
_mockMediator.Setup(m => m.Send<List<ZipCodeModel>>(It.Is<ZipCodeByStateQuery>(plist => plist.StateId == "VA")))
.Returns(new List<ZipCodeModel>()
{
new ZipCodeModel(){ ZipCodeId = "7690", ZipCode = "24210" },
new ZipCodeModel(){ ZipCodeId = "7691", ZipCode = "24211" },
new ZipCodeModel(){ ZipCodeId = "7692", ZipCode = "24212" }
});
// Act
//var actual = _controller.GetZipByState("VA");
JsonResult actual = _controller.GetZipByState("VA") as JsonResult;
List<ZipCodeModel> result = actual.Data as List<ZipCodeModel>;
// Assert
Assert.Equal("24211", (dynamic)actual.Data);
}
我可以在我的 Json 下看到我需要获取的数据:
actual.Data.ZipCodes[1] 在此屏幕截图中:
但是当我尝试将 actual.Data 放入结果变量中然后执行断言时,它告诉我结果为空。
你应该怎么做?
您的问题是您正在转换为错误的类型。
这里是这一行:
List<ZipCodeModel> result = actual.Data as List<ZipCodeModel>;
应该改为
var result = actual.Data.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.FirstOrDefault(x => x.Name == "ZipCodes")
.GetValue(actual.Data) as List<ZipCodeModel>;