Обратите внимание, это для System.Text. Json, а не Json. Net, поэтому Как модульное тестирование пользовательского JsonConverter не является дубликатом.
Мне нравится модульное тестирование моего пользовательского JsonConverter:
using System.Text.Json;
public class DateTimeShortConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// support yyyy-MM-dd but also with times
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
}
Мне нужен Utf8JsonReader
, и мне нужно накормить его string
.
Я пробовал это:
byte[] bytes = Encoding.UTF8.GetBytes("2019-01-02");
var reader = new Utf8JsonReader(bytes.AsSpan());
Кажется, что работает, но при выполнении reader.GetString()
:
System.InvalidOperationException: невозможно получить значение типа токена. «Нет» в виде строки. в System.Text. Json .Utf8JsonReader.GetString ()
reader.GetString()
должно быть правильным, см. пример Microsoft , поэтому я думаю, что я кормлю Utf8JsonReader
неправильно.
reader.Position
доступно только для чтения, так что это тоже не вариант. Как мне правильно кормить Utf8JsonReader строкой?
Полный тест:
using System;
using System.Text;
using System.Text.Json;
Using Xunit;
[Fact]
public void ReadDateTimeTests()
{
// Arrange
var input = "2019-01-02";
var dateTimeShortConverter = new DateTimeShortConverter();
byte[] bytes = Encoding.UTF8.GetBytes(input);
var reader = new Utf8JsonReader(bytes.AsSpan());
Type typeToConvert = typeof(DateTime);
JsonSerializerOptions options = new JsonSerializerOptions();
var expected = new DateTime(2019, 01, 02);
// Act
var result = dateTimeShortConverter.Read(ref reader, typeToConvert, options);
// Assert
Assert.Equal(expected, result);
}
обновление: это также не отвечает на мой вопрос: Исключение при тестировании пользовательского JsonConverter . Я тоже пробовал (из этого ответа) без везения:
byte[] bytes = Encoding.UTF8.GetBytes(input);
var reader = new Utf8JsonReader(bytes.AsSpan(), false, new JsonReaderState(new JsonReaderOptions()));
Обновление
"2019-01-02"
неверно JSON в C#, но "\"2019-01-02\""
есть и все еще дает ту же ошибку.