2013-06-21 15 views
10

Ho questo codice in C# controller MVC:Come accedere ai dati JsonResult durante la prova in ASP.NET MVC

[HttpPost] 
    public ActionResult Delete(string runId) 
    { 
     if (runId == "" || runId == null) 
     { 
      return this.Json(new { error = "Null or empty params" }); 
     } 
     try 
     { 
      int userId = (int)Session["UserId"]; 
      int run = Convert.ToInt32(runId); 

      CloudMgr cloud = new CloudMgr(Session); 
      cloud.DeleteRun(userId, run); 

      return this.Json(new { success = true }); 
     } 
     catch (Exception ex) 
     { 
      return this.Json(new { error = ex.ToString() }); 
     } 
    } 

Come posso accedere al mio campo JSON "errore" in un ControllerTest per verificare se è nullo o no?

[TestMethod] 
    public void DeleteWrongParam() 
    { 
     WhatIfController controller = new WhatIfController(); 
     controller.ControllerContext = 
     TestUtils.CreateMockSessionControllerContext().Object as ControllerContext; 

     JsonResult result = controller.DeleteWhatIf(null) as JsonResult; 

Assert.IsNotNull(result.Data.error); è ciò che mi piacerebbe fare. Qualche idea? Grazie.

risposta

15

è possibile utilizzare in questo modo, il risultato sarà la definizione dell'oggetto prevista. Quindi, in caso di successo, il tuo flag di successo sarà VERO altrimenti falso e se falso allora dovresti aspettarti che la proprietà di errore venga aggiornata con il messaggio di errore.

 JsonResult jsonResult = oemController.List() as JsonResult; 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     Result result = serializer.Deserialize<Result>(serializer.Serialize(jsonResult.Data)); 

     public class Result 
     { 
      public bool success ; 
      public string error; 
     } 
+0

Qual è lo spazio dei nomi per la classe Result? Grazie. – juanchoelx

+0

@juanchoelx Risultato è la tua classe definita come questa classe Risultato {successo di bool pubblico; errore stringa pubblica} – Devesh

+0

@juanchoelx Ho aggiornato il mio codice nella mia risposta. – Devesh

18

JavaScriptSerializer è valido per stringa e tipo statico. Qui hai creato il tipo anonimo come Json (new {success = true}). In questo caso, è meglio usare il tipo dinamico.

JsonResult result = controller.DeleteWhatIf(null) as JsonResult; 
dynamic dresult = result.Data; 
Assert.IsTrue(dresult.succes); 

È necessario importare DLL Microsoft.CSharp per testare il progetto.

Se il test e il controller si trovano in diverse assemblee, è necessario effettuare il montaggio di prova di un "amico" di montaggio del gruppo di controllo, in questo modo:

[assembly: InternalsVisibleTo ("nome dell'assembly TestProject")]

+0

+1 per il suggerimento di InternalsVisibleTo. Ho provato a fare questo senza avere quell'attributo assembly posto e non riuscivo a capire perché all'inizio stava esplodendo. –

+0

Secondato. Ho modificato la risposta per attirare l'attenzione su 'InternalsVisibleTo'. –

+2

puoi rendere più semplice 'dynamic result = controller.DeleteWhatIf (null) come JsonResult; Assert.IsNotNull (result.Data.error); '=) – RMazitov

Problemi correlati