我有一个自定义JsonConverter,它从前端获取一个本地日期时间字符串,并使用NodaTime将其转换为/etc/sudoers
。
我替换了Json.NET中的默认解析器。
DateTimeOffset
所以在我的测试中,我需要确保配置它。
幕后发生的事情是我的API控制器发出POST请求。如果ViewModel(在API操作中使用)包含formatter.SerializerSettings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
ContractResolver = new CustomResolver(),
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
属性,则关联的JSON datetime属性将通过转换器。
当触发转换器时,应用程序首先获得DateTimeOffset
:
User.Identity
成功后,我们会提取var user = (ClaimsIdentity) Thread.CurrentPrincipal.Identity;
声明,其中包含IANA时区ID(例如“America / New_York”)。
我们使用它将本地日期时间转换为相应的DateTimeOffset。
这就是我想要测试的内容。
我有JSON对象:
Locality
但我仍然坚持如何执行 -
NameValueCollection nameValueCollection = new NameValueCollection() {
{"dateCreated", "2015-11-30T14:22:00+1:00"},
{"message", "Some message."},
{"timelinePostId", "1"},
{"applicationUser", ""},
{"thumbs","" }
};
我找到了这个MockHelper类,所以我准备好了。
// Arrange
// Act
// Assert
所以我有我的JSON模拟,我有我的身份模拟,但我怎么让它工作?非常感谢任何帮助。
答案 0 :(得分:0)
这是一种不需要模拟整个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, Type objectType, object existingValue, JsonSerializer serializer, ClaimsIdentity identity)
{
// do stuff...
}
然后针对DeserializeDate
编写单元测试。