2013-06-21 6 views
5

Piszę filtr akcji OnActionExecuting i chcę przetestować funkcjonalność urządzenia.Makabryczne HttpActionContext.ActionArguments podczas testowania Web.Api ActionFilter

Jedną z rzeczy, które musi wykonać filtr, jest przeprowadzenie pewnych walidacji na argumentach akcji przekazanych do filtra.

Dostaję argumenty ze słownika actionContext.ActionArguments, który działa dobrze dla realizacji, ale mam trudny czas, aby go przetestować.

W moim teście nie mogę ustawić actionContext.ActionArguments, ponieważ nie ma on ustawiacza i nie mogę go wyśmiać, ponieważ nie jest wirtualny.

Zostało mi to trochę kłopotliwe, czy mogę uzyskać jakąkolwiek wartość z testów jednostkowych w tym scenariuszu?

Odpowiedz

9

Zgodnie z kodem źródłowym AspNetWebStack, actionContext.ActionArguments jest po prostu prostym Słownikiem. Dlatego jest całkiem banalnie wstawiać do niej parę wartości klucza. Po prostu zrobiłbym coś w rodzaju:

actionContext.ActionArguments [key] = value;

w części aranżacyjnej testu jednostki.

nadzieję, że pomoże

4

Zobacz mój blog na to: 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

Czy wiesz, dlaczego nie instancją Dictionary mogą być przekazywane do ActionArguments? Nie działa dla mnie i mówi, że ActionArguments jest tylko do odczytu. – Gerrit

+0

Przepraszamy za opóźnienie. Nie próbuj tego. –

Powiązane problemy