c# – 如何在ASP.NET Web API中单元测试自定义JsonConverter?
发布时间:2020-12-15 20:57:00 所属栏目:百科 来源:网络整理
导读:我有一个自定义的JsonConverter,从前端获取本地日期时间字符串,并使用NodaTime将其转换为DateTimeOffset. 我替换了Json.NET中的默认解析器. formatter.SerializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented,ContractResolve
我有一个自定义的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编写单元测试. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |