2012-12-20 6 views
12

Ho un metodo che restituisceCome leggere una proprietà di un tipo anonimo?

return new System.Web.Mvc.JsonResult() 
{      
    Data = new 
    { 
     Status = "OK", 
    } 
} 

ho bisogno di scrivere uno unit test in cui ho bisogno di verificare che jsonResult.Data.status= "OK".

Come si legge la proprietà status?

Aggiornamento: Ho provato [assembly: InternalsVisibleTo ("TestingAssemblyName")], ma questo non ha aiutato. Ho ricevuto l'errore {"'System.Web.Mvc.JsonResult' non contiene una definizione per 'Stato'"}

Inoltre, penso che preferirò non modificare il codice che sto testando.

Quindi ho preso il consiglio di Jon e ho usato la riflessione.

 var type = jsonResult.Data.GetType(); 

     var pinfo = type.GetProperty("Status"); 

     string statusValue = pinfo.GetValue(jsonResult.Data,null).ToString(); 

     Assert.AreEqual("OK", statusValue); 
+0

in un'unità di test MS o Javascript? –

+0

Se stai facendo questo da C#, puoi semplicemente usare 'dynamic' e lasciare che il raccoglitore dinamico si prenda cura di esso. – vcsjones

+0

test dell'unità gallio. Quello che sto cercando è Assert.AreEqual ("OK", jsonResult.Data.Status) – developer747

risposta

17

L'approccio più semplice sarebbe probabilmente quella di utilizzare la tipizzazione dinamica:

dynamic foo = ret.Data; 
Assert.AreEqual("OK", foo.status); 

Si noti che è necessario utilizzare [InternalsVisibleTo] al fine di dare la vostra unità di accesso montaggio di prova per il tipo anonimo nella vostra produzione assemblaggio, in quanto verrà generato con l'accesso internal.

In alternativa, utilizzare solo la riflessione.

6

dynamic:

dynamic testObject = YourMethodThatReturnsDynamicObject().Data; 
Assert.AreEqual("OK", testObject.Status); 
+1

Il valore previsto dovrebbe essere il primo argomento di "AreEqual', e il valore effettivo dovrebbe essere il secondo. –

+0

@JonSkeet .. ci andate, anche se mentre lo scrivevo non pensavo (a volte l'intellisense va molto lontano!). –

+0

@ AnonymousVoter: apprezzo il voto di simpatia .. difficile da ottenere quando rispondi contemporaneamente a Jon! :) –