1

I have a JsonConverter. I created a unit test for the ReadJson. I have an error in my unit test that says the reader value is null. How can I read the entire string from the reader?

public class StringConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(T);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return JsonConvert.DeserializeObject<T>((string)reader.Value);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        JsonConvert.SerializeObject(value);
    }
}

My code for unit testing

    private Converter.StringConverter<InstanceSettings> _converter;

    private JsonTextReader CreateJsonReader(string json)
        => new JsonTextReader(new StringReader(json));

    [SetUp]
    public override void Setup()
    {
        base.Setup();
        _converter = new Converter.InstanceSettingsConverter();
    }

   public void StringConverter_ReadJson_InvalidJson_EmptyInstanceSettings()
    {
        // Arrange
        var serializer = new JsonSerializer();
        var json = "{\"property\":{\"search\":true}}";
        var reader = CreateJsonReader(json);

        // Act
        var result = _converter.ReadJson(reader, typeof(InstanceSettings), null, serializer);

        Assert.IsNotNull(result);
        Assert.IsAssignableFrom<InstanceSettings>(result);
    }

I user the converter to convert string to my type

    [JsonConverter(typeof(StringConverter<InstanceSettings>))]
    [JsonProperty("settings")]
    public InstanceSettings Settings { get; set; }
    

1 Answers1

0

I changed my converter and that fixed my issue

public class InstanceSettingsConverter : JsonConverter<InstanceSettings>
{
    public override InstanceSettings ReadJson(JsonReader reader, Type objectType, InstanceSettings existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var json = reader.ValueType == typeof(string) ? reader.Value.ToString() : JRaw.Create(reader).ToString();
        return JsonConvert.DeserializeObject<InstanceSettings>(json);
    }

    public override void WriteJson(JsonWriter writer, InstanceSettings value, JsonSerializer serializer)
    {
        JsonConvert.SerializeObject(value);
    }
}