2016-06-29 3 views
0

Je veux recevoir un JSON de mon API REST et traduire en Poços. Il est censé être simple, mais il se révèle être pas :(Flurl: ne peut pas sérialiser chaîne JSON reçu de HttpTest

Dans mon test unitaire j'ai une chaîne de données échantillon JSON que l'API envoie:

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"" 
      }]"; 

que j'envoie à mon code de la test à travers HttpTest:

httpTest.RespondWithJson(mockJsonResponse); 

Je suis en train de le recevoir dans mon code:

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

Mais il échoue toujours wi th une erreur très générique dans le test Explorer:

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

creuser plus il semble que cela ne peut pas sérialiser la chaîne en poco. Je l'ai essayé de faire sérialisation manuelle directement avec la variable de chaîne ci-dessus et il se traduit à ma classe de modèle facilement, donc il ne pouvait pas y avoir un problème de structure du code.

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

Tous ces pas:

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(); 

La classe modèle:

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; } 
} 

Modifier J'ai essayé de l'obtenir sous forme de chaîne avec GetStringAsync, et il semble que la chaîne a été mutilé en quelque sorte. Cette chaîne passée à JsonConvert.Deserialize<Model>() échouera le test. C'est ce que montre le débogueur Visual Studio. Il y a beaucoup de personnages d'échappement.

Screenshot of the string received from HttpTest in Visual Studio debugger

Répondre

1

RespondWithJson prend un objet qui sera publié en feuilleton à JSON pour vous, pas une chaîne qui est déjà publié en feuilleton. Représentez la réponse de test avec un objet anonyme et vous devriez être bon:

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); 
1

En essayant de se moquer manuellement JSON vous n'êtes pas produsing JSON bien formaté.

je suggère la création d'une collection, sérialisation et retour que votre échantillon 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);