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

时间:2015-12-01 10:16:58

标签: c# unit-testing asp.net-web-api mocking httprequest

我有一个自定义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模拟,我有我的身份模拟,但我怎么让它工作?非常感谢任何帮助。

1 个答案:

答案 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编写单元测试。