2013-06-21 9 views
5

Ich schreibe einen OnActionExecuting-Action-Filter und ich möchte Einheit testen die Funktionalität.Mocking HttpActionContext.ActionArguments beim Testen von Web.Api ActionFilter

Eines der Dinge, die der Filter tun muss, besteht darin, eine Validierung der in den Filter übergebenen Aktionsargumente durchzuführen.

Ich bekomme die Argumente von der actionContext.ActionArguments Dictionary, die für die Implementierung gut funktioniert, aber ich habe eine schwierige Zeit zu Unit-Test verwalten.

In meinem Test kann ich actionContext.ActionArguments nicht festlegen, da es keinen Setter hat und ich kann es auch nicht vortäuschen, da es nicht virtuell ist.

Das hat mich in eine Zwickmühle gebracht, ob ich in diesem Szenario irgendeinen Wert aus Unit-Tests bekommen kann?

Antwort

9

Gemäß dem AspNetWebStack-Quellcode ist actionContext.ActionArguments nur ein einfaches Wörterbuch. Es ist daher ziemlich trivial, ein Schlüsselwertpaar darin einzufügen. Ich würde nur etwas tun wie

actionContext.ActionArguments [Schlüssel] = Wert;

im Arrangierteil des Komponententests.

Hoffnung, die

4

Sehen Sie mein Blog, das hilft: https://dondeetan.com/2016/09/19/validating-and-unit-testing-web-api-2-route-attribute-parameters/

var mockactioncontext = new HttpActionContext 
      { 
       ControllerContext = new HttpControllerContext 
       { 
        Request = new HttpRequestMessage() 
       }, 
       ActionArguments = { { "employeeid", "null" } } 
      }; 

      mockactioncontext.ControllerContext.Configuration = new HttpConfiguration(); 
      mockactioncontext.ControllerContext.Configuration.Formatters.Add(new JsonMediaTypeFormatter()); 

      var filter = new <youractionattributefilterclass>(); 
      filter.OnActionExecuting(mockactioncontext); 
      Assert.IsTrue(mockactioncontext.Response.StatusCode == HttpStatusCode.BadRequest); 
+0

Wissen Sie, warum nicht eine Instanz von Dictionary kann ActionArguments weitergegeben werden? Es scheitert für mich und sagt ActionArguments ist schreibgeschützt. – Gerrit

+0

Sorry späte Antwort. Hab das nicht versucht. –