微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个自定义的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编写单元测试.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐