2014-03-18 45 views
8

Ich versuche, einen Test für einige unserer Webapi-Anrufe zu erstellen, und ich habe Schwierigkeiten beim Zugriff auf die Ergebnisse. In allen Beispielen, die ich gesehen habe, benutzten sie OkNegotiatedContentResult. Das Problem ist, dass wir in unseren Web-API-Aufrufen die Daten oft in anonyme Objekte verpacken, so dass wir Datensätze kombinieren können. Ich übersehe wahrscheinlich etwas Offensichtliches, aber ich kann nicht den richtigen Weg finden, die Ergebnisinformationen zu überprüfen, um sie zu validieren.IHttpActionResult Anonymes Objekt - Ergebnisse validieren

WebAPI Snippet

var orderInfo = new 
{ 
    Customer = customerInfo, 
    Order = orderInfo 
} 

return Ok(orderInfo); 

Api Test-Snippet

[TestMethod] 
    public void TestGetOrderInfo() 
    { 
     var controller = new OrderController(_repo); 
     IHttpActionResult results = controller.GetOrderInfo(46); 

     Assert.IsNotNull(results); 


    } 

Wie kann ich die Ergebnisse mit der OkNegotiatedContentResult überprüfen, wenn ein anonymer Typ beteiligt ist?

+0

habe dich jemals funktioniert das? Ich habe genau das gleiche Problem, das versucht, einen Controller zu testen, der JSON über 'IHttpActionResult' zurückgibt und einen anonymen Typ sieht, weil er einen Root-Knoten vor der Rückkehr vom Controller hinzufügen muss. Ich kann das nicht testen, weil ich nicht richtig "OkNegoatedContentResult" verwenden kann. Ich habe den dynamischen Ansatz unten ohne Erfolg ausprobiert. – Patrick

Antwort

10

Der Grund für die Probleme mit anonymen Typen besteht darin, dass es sich um interne Typen handelt und nicht um öffentliche, sodass Ihre Tests diese nicht verwenden können.

Falls Sie ein InternalsVisibleTo Attribut zu Ihrem WebAPI Projekt hinzufügen werden Sie dann in der Lage sein, das Ergebnis und dessen Inhalt über dynamische zB referenzieren:

[TestMethod] 
public void TestGetOrderInfo() 
{ 
    var controller = new OrderController(_repo); 
    dynamic results = controller.GetOrderInfo(46); 
    dynamic content = results.Content; 

    ... 

} 
+4

Ich habe genau dieses Problem mit einem anonymen Typ und IHttpActionResult. Ich muss einen Root-Knoten zu meinem JSON-Return hinzufügen, also von Web API 2.0 Ich mache 'return Json (new {User = person});' um dort einen Root-Knoten namens "User" zu bekommen. Dies gibt jetzt einen anonymen Typ zurück. Ich habe versucht, Ihrem Beispiel zu folgen, aber es scheitert an 'dynamic content = results.Content' mit' 'object' enthält keine Definition für 'Content' – Patrick

2

Anonyme Objekte sind intern in der Anordnung, die sie geschaffen haben. Wenn Sie Komponententests in einer getrennten Assembly (DLL) durchführen, müssen Sie explizit angeben, dass Sie interne Werte mit dieser Assembly unter Verwendung des InternalsVisibleTo-Attributs teilen möchten.

1

Patrick gefunden, warum Sie Fehler erhalten "'Objekt' enthält keine Definition für 'Inhalt'". Der vom SUT generierte anonyme Typ ist intern. Teile Einbauten mit dem Testprojekt und Sie sollen den anonymen Typen inspizieren können, durch so etwas wie dies in der AssemblyInfo.cs im Projekt zu tun: wird

getestet
[assembly: InternalsVisibleTo("Tests.Unit")] 

Gefunden dies in Artikel hier http://patrickdesjardins.com/blog/how-to-unit-test-a-method-that-return-an-anonymous-type

Verwandte Themen