我们以一种奇怪的格式从 API 中获取序列化的 DateTimes:/Date(1574487012797)/
为了使用 反序列化这个值System.Text.Json
,我们编写了自己的JsonConverter
:
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var dateTimeString = reader.GetString();
dateTimeString = dateTimeString.Replace("/Date(", "");
dateTimeString = dateTimeString.Replace(")/", "");
var epoch = Convert.ToInt64(dateTimeString);
var dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(epoch);
return dateTimeOffset.UtcDateTime;
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
}
}
我想为这个转换器写一个单元测试。我尝试的是以下内容:
public class DateTimeConverterTest
{
private readonly DateTimeConverter testee;
public DateTimeConverterTest()
{
this.testee = new DateTimeConverter();
}
[Fact]
public void Read_WhenCalledWithSerializedDateTime_ThenReturnDeserializedDateTime()
{
var a = "{\r\n \"PublikationsDatum\": \"/Date(1573581177000)/\" \r\n}";
//var serializedDateTime = "/Date(1573581177000)/";
var utf8JsonReader = new Utf8JsonReader(Encoding.UTF8.GetBytes(a), false, new JsonReaderState(new JsonReaderOptions()));
//utf8JsonReader.TokenType = JsonTokenType.String;
var deserializedDateTime = this.testee.Read(ref utf8JsonReader, typeof(DateTime), new JsonSerializerOptions {IgnoreNullValues = true});
}
private class TestClass
{
public DateTime PublikationsDatum { get; set; }
}
}
不幸的是,在尝试执行单元测试时,我得到了一个InvalidOperationException
atvar dateTimeString = reader.GetString();
System.InvalidOperationException:'无法将令牌类型'None'的值作为字符串获取。'
如何正确设置测试/我做错了什么?