我有一个自定义的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; }
解决方法
这是一种不需要模拟整个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编写单元测试.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。