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. Там много спасательных персонажей.
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);