gpt4 book ai didi

json - NancyFX : How do I deserialize dynamic types via BrowserResponse. Body.DeserializeJson(单元测试)

转载 作者:行者123 更新时间:2023-12-04 18:21:52 25 4
gpt4 key购买 nike

我有以下 NancyFX 单元测试。我使用 Shouldly断言库,以提供从 .Should--- 开始的扩展方法集

[Fact]
public void Assessment__Should_return_assessment_state_for_specified_user()
{
const AssessmentState assessmentState = AssessmentState.Passed;
var user = Fake.Mentor();

using (var db = Fake.Db())
{
db.Save(user);
Fake.Assessment(user.Id, db, assessmentState);
db.ClearStaleIndexes();
}

var response = Fake.Browser(user.UserName, user.Password)
.Get("/assessment/state/" + user.Id, with => with.HttpRequest());

//var result = (dynamic)body.DeserializeJson<ExpandoObject>();
var result = (dynamic) JsonConvert.DeserializeObject<ExpandoObject>(response.Body.AsString());

result.ShouldNotBe(null);
((AssessmentState) result.State).ShouldBe(assessmentState);
}

该测试调用 AssessmentService uri 定义为 /assessment/state/" + user.Id它返回一个简单的 JSON 对象定义,它有一个属性 State类型(枚举) AssessmentState , 要么 Passed , FailedNotStarted .

这是服务处理程序,因此您可以看到没有任何技巧。
Get["/assessment/state/{userid}"] = parameters =>
{
var assessment = AssessmentService.GetByUserId(Db, (string)parameters.userid);
return assessment == null ? HttpStatusCode.NotFound : Response.AsJson(new
{
assessment.State
});
};

这是此服务调用返回的 JSON 示例:
{"State":1}

一切正常,直到我尝试反序列化假 Nancy 浏览器返回的 JSON。首先我尝试使用 Nancy 的 BrowserResponse.Body 提供的内置方法。目的:
var result = (dynamic)response.Body.DeserializeJson<ExpandoObject>();

这将反序列化为一个空对象。这不好。但是,如果我们使用 Newtonsoft 等价物,那么一切都很好(几乎)。
var result = (dynamic) JsonConvert.DeserializeObject<ExpandoObject>(response.Body.AsString());

JSON 反序列化现在可以工作,因此以下应该断言通过了出色的结果:
((AssessmentState) result.State).ShouldBe(assessmentState);

但是,由于我怀疑与匿名类型有关的原因,以下行在运行时失败(它编译得很好)。
result.ShouldNotBe(null);

Shouldly Exception

这是相当多的信息。让我把它提炼成两个问题:
  • 鉴于 Newtonsoft 版本可以,为什么 Nancy 内置的 JSON 反序列化器不起作用?
  • 如何使用 JSON 反序列化生成的动态类型,以便应该扩展方法不会导致运行时异常?

  • 谢谢

    最佳答案

    第一个问题我不能回答,但是WRT Shouldly 和动态类型,Shouldly 的ShouldNotBe method 是 object 上的扩展方法. DLR 不允许您对类型为 dynamic 的对象调用扩展方法。 (因此您看到的运行时绑定(bind)程序异常)

    我建议,如果您想在结果上调用 ShouldNotBe(null),则必须将其转换为 object第一个(即:((object)result).ShouldNotBe(null))

    -X

    关于json - NancyFX : How do I deserialize dynamic types via BrowserResponse. Body.DeserializeJson(单元测试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481895/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com