2017-10-11 2 views
1

Je suis en train de revenir juste un objet anonyme très simple JSON comme ceci:Parsing réponse JsonResult dynamique de l'API donne « l'objet ne contient pas la définition pour X »

[HttpGet] 
    public JsonResult GetJson() 
    { 
     return Json(new { 
      id = 1, 
      child = new 
      { 
       id = 12, 
       name = "woop woop" 
      } 
     }); 
    } 

, j'ai un test qui vérifient que id = 1

[TestMethod] 
    public void TestMethod4() 
    { 
     var controller = new ValuesController(); 
     dynamic result = controller.GetJson(); 

     Assert.AreEqual(1, result.Value.id); 
    } 

Ce résultat dans:

message: méthode d'essai UnitTestProject1.UnitTest1.TestMethod4 a jeté exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'objet' ne contient pas de définition pour 'id'

Image from VS

Répondre

2

Votre méthode renvoie un JsonResult qui contient une propriété Data qui est votre objet, de sorte que votre code doit être

[TestMethod] 
public void TestMethod4() 
{ 
    var controller = new ValuesController(); 
    dynamic result = controller.GetJson().Data; // returns { id = 1, child = new { id = 12, name = "woop woop" } } 
    Assert.AreEqual(1, result.id); 
} 

Cependant les objets anonymes sont internal si vous devez également rendre votre objet visible à votre projet de test. Dans le fichier AssemblyInfo.cs du projet contenant la classe ValuesController, ajoutez

[assembly: InternalsVisibleTo("YourProjectName.UnitTestProject1")] 
+0

belle réponse. Sera utile pour les autres aussi –

+0

Le GetJson() n'a pas de .Data, il a .Value. Je n'ai aucun fichier AssemblyInfo.cs. C'est un projet .Net Core 1.1. – ganjan

+0

Ensuite, étiqueter votre question correctement! –