加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 20:57:00 所属栏目:百科 来源:网络整理
导读:我有一个自定义的JsonConverter,从前端获取本地日期时间字符串,并使用NodaTime将其转换为DateTimeOffset. 我替换了Json.NET中的默认解析器. formatter.SerializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented,ContractResolve
我有一个自定义的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编写单元测试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读