Flurl: не может сериализовать строку JSON, полученную из HttpTest

Я хочу получить JSON от моего REST API и перевести его в POCO. Это должно быть просто, но оказывается не так:(

В моем модульном тесте у меня есть строка с примерами данных JSON, которые API отправляет:

string mockJsonResponse = @"[{
                ""project_name"": ""Mailjet Support"",
                ""cluster_name"": ""24/7 Support"",
                ""is_billable"": ""1"",
                ""usedtime"": ""128""
            },
            {
                ""project_name"": ""Caring"",
                ""cluster_name"": ""Caring"",
                ""is_billable"": ""0"",
                ""usedtime"": ""320""
            },
            {
                ""project_name"": ""Engagement"",
                ""cluster_name"": ""Community"",
                ""is_billable"": ""0"",
                ""usedtime"": ""8""
            }]";

который я отправляю на мой код из теста через HttpTest:

httpTest.RespondWithJson(mockJsonResponse);

Я пытаюсь получить его в своем коде:

dynamic response = "http://api.com".GetJsonListAsync();

Но это всегда дает сбой с очень общей ошибкой в ​​Test Explorer:

Result Message: Flurl.Http.FlurlHttpException : Request to http://api.com failed.

Дальнейшее копание, похоже, не может сериализовать строку в poco. Я попытался выполнить сериализацию вручную с помощью строковой переменной, приведенной выше, и она легко переводится в мой класс модели, поэтому это не могло быть проблемой структуры кода.

// same string variable above
var jsons = JsonConvert.DeserializeObject<List<Model>>(mockJsonResponse); // this runs fine

Все это не удалось:

dynamic response = await "http://www.api.com".GetJsonAsync();
dynamic response = await "http://www.api.com".GetJsonAsync<Model>();
var response = await "http://www.api.com".GetJsonAsync<Model>();    
IList<dynamic> response = await "http://www.api.com".GetJsonListAsync();

Модельный класс:

public class Model
{
    public string project_name { get; set; }
    public string cluster_name { get; set; }
    public string is_billable { get; set; }
    public string usedtime { get; set; }
}

Изменить Я попытался получить его как строку с GetStringAsyncи кажется, что струна каким-то образом повреждена. Эта строка передана JsonConvert.Deserialize<Model>() провалит тест. Это то, что показывает отладчик Visual Studio. Там много спасательных персонажей.

Снимок экрана: строка, полученная от HttpTest в отладчике Visual Studio

2 ответа

Решение

RespondWithJson принимает объект, который будет сериализован для вас в JSON, а не строку, которая уже сериализована. Представьте ответ теста с анонимным объектом, и вы должны быть хороши:

var mockJsonResponse = new[] {
    new {
        project_name = "Mailjet Support",
        cluster_name = "24/7 Support",
        is_billable = "1",
        usedtime = "128"
    },               
    new {                
        project_name = "Caring",
        cluster_name = "Caring",
        is_billable = "0",
        usedtime = "320"
    },             
    new {               
        project_name = "Engagement",
        cluster_name = "Community",
        is_billable = "0",
        usedtime = "8"
    }
};

httpTest.RespondWithJson(mockJsonResponse);

Пытаясь вручную смоделировать JSON, вы не используете JSON в хорошем формате.

Я бы предложил создать коллекцию, сериализовать ее и вернуть в качестве примера JSON.

Model[] models = new []{
    new Model {
        project_name = "Mailjet Support",
        cluster_name = "24/7 Support",
        is_billable = "1",
        usedtime = "128"
    },               
    new Model{                
        project_name = "Caring",
        cluster_name = "Caring",
        is_billable = "0",
        usedtime = "320"
    },             
    new Model{               
        project_name = "Engagement",
        cluster_name = "Community",
        is_billable = "0",
        usedtime = "8"
    }
};

string mockJsonResponse = Newtonsoft.Json.JsonConvert.SerializeObject(models);
Другие вопросы по тегам