c# – 如何在ASP.NET Web API中单元测试自定义JsonConverter?

c# – 如何在ASP.NET Web API中单元测试自定义JsonConverter?,第1张

概述我有一个自定义的JsonConverter,从前端获取本地日期时间字符串,并使用NodaTime将其转换为DateTimeOffset. 我替换了Json.NET中的默认解析器. formatter.SerializerSettings = new JsonSerializerSettings { Formatting = Formatting.In 我有一个自定义的JsonConverter,从前端获取本地日期时间字符串,并使用NodaTime将其转换为DateTimeOffset.

我替换了Json.NET中的默认解析器.

formatter.SerializerSettings = new JsonSerializerSettings          {              Formatting = Formatting.Indented,ContractResolver = new Customresolver(),ReferenceLoopHandling = ReferenceLoopHandling.Ignore          };

所以在我的测试中我需要确保配置它.

引擎盖下发生的事情是向我的API控制器发出POST请求.如果viewmodel(在API *** 作中使用)包含DateTimeOffset属性,则关联的JsON datetime属性将通过转换器.

当触发转换器时,应用程序首先获取User.IDentity:

var user = (ClaimsIDentity) Thread.CurrentPrincipal.IDentity;

成功后,我们提取地点声明,其中包含IANA时区ID(例如“America / New_York”).

我们使用它将本地日期时间转换为相应的DateTimeOffset.

这是我想测试的.

我有JsON对象:

nameValueCollection nameValueCollection = new nameValueCollection() {            {"dateCreated","2015-11-30T14:22:00+1:00"},{"message","Some message."},{"timelinePostID","1"},{"applicationUser",""},{"thumbs","" }        };

但我坚持如何执行 –

// Arrange// Act// Assert

我找到了这个MockHelper类,所以我准备好了.

public static httpContextBase FakehttpContext(httpVerbs verbs,nameValueCollection nameValueCollection){    var httpContext = new Mock<httpContextBase>();    var user = new ApplicationUser {             ID = "abc",TimezoneID = "America/New_York"         };    var request = new Mock<httpRequestBase>();    request.Setup(c => c.Form).Returns(nameValueCollection);    request.Setup(c => c.queryString).Returns(nameValueCollection);    request.Setup(c => c.RequestType).Returns(verbs.ToString().toupper());    var response = new Mock<httpResponseBase>();    var session = new Mock<httpSessionStateBase>();    var server = new Mock<httpServerUtilityBase>();    httpContext.Setup(c => c.Request).Returns(request.Object);    var u = verbs.ToString().toupper();    httpContext.Setup(c => c.Response).Returns(response.Object);    httpContext.Setup(c => c.Server).Returns(server.Object);    httpContext.Setup(c => c.User.IDentity.GetUserID()).Returns("abc");    httpContext.Setup(c => c.User.ApplicationUser()).Returns(user);    return httpContext.Object;}

所以我有我的JsON模拟,我有我的身份模拟,但我怎么让它工作?任何帮助是极大的赞赏.

解决方法 这是一种不需要模拟整个httpContext的方法.

在JsonConverter类中,将ReadJson中的逻辑重构为一个单独的方法,传入IDentity对象:

public overrIDe object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer){    return DeserializeDate(reader,objectType,existingValue,serializer,(ClaimsIDentity)Thread.CurrentPrincipal.IDentity);}public object DeserializeDate(JsonReader reader,JsonSerializer serializer,ClaimsIDentity IDentity){    // do stuff...}

然后针对DeserializeDate编写单元测试.

总结

以上是内存溢出为你收集整理的c# – 如何在ASP.NET Web API中单元测试自定义JsonConverter?全部内容,希望文章能够帮你解决c# – 如何在ASP.NET Web API中单元测试自定义JsonConverter?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1226716.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存