2015-12-01 104 views
2

我有一個自定義的JsonConverter,它從前端獲取本地日期時間字符串,並使用NodaTime將其轉換爲DateTimeOffset如何在ASP.NET Web API中測試自定義的JsonConverter?

我替換了Json.NET中的默認解析器。

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

所以在我的測試中,我需要確保我配置它。

內部發生的事情是POST請求發送到我的API控制器。如果ViewModel(用於API操作)包含DateTimeOffset屬性,則關聯的JSON datetime屬性將通過轉換器。

當轉換器被觸發時,則應用程序首先獲取User.Identity

var user = (ClaimsIdentity) Thread.CurrentPrincipal.Identity; 

成功時,我們提取Locality權利要求,其中包含IANA時區ID(例如,「美國/紐約」)。

我們使用它將本地日期時間轉換爲相應的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模擬,我有我的身份模擬,但我如何得到它的工作?任何幫助是極大的讚賞。

+0

這種有點東西驅使我設計我的網絡API控制器的堅果。他們使得它在教程中看起來非常簡單..然後,你做了真實世界的事情......而且你真的最終嘲笑整個Web管道......真是一團糟!我還有一個特殊的POCO,我爲此設計了一個JSON轉換,並由GlobalConfiguration註冊..唉! – bkwdesign

回答

0

這是一種不需要模擬整個HttpContext的方法。

在你JsonConverter類,重構在ReadJson邏輯到一個單獨的方法,傳遞在身份對象:

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

相關問題