2012-06-03 16 views
126

Sto provando a scrivere alcuni test di unità per il mio ApiController e ho riscontrato alcuni problemi. C'è un buon metodo di estensione chiamato Request.CreateResponse che aiuta molto nella generazione della risposta.Test di unità ASP.NET WebApi con Request.CreateResponse

public HttpResponseMessage Post(Product product) 
{ 
    var createdProduct = repo.Add(product); 
    return this.Request.CreateResponse(HttpStatusCode.Created, createdProduct); 
} 

Esiste un modo per prendere in giro CreateResponse senza l'utilizzo di mock parziali o utilizzando diretta di "nuova HttpResponseMessage (...)"?

+1

Perché si vuole prendere in giro il 'CreateResponse'? Perché non dichiarare sulle proprietà restituite 'HttpResponseMessage'' Content' e 'StatusCode' che sono impostati i valori corretti? – nemesv

+3

Se eseguo questo test sui moduli dell'unità di metodo, fallirà con l'eccezione che la configurazione non è impostata. – asa

+1

Ok, vergognimi, ho solo bisogno di scrivere this.Request.CreateResponse (HttpStatusCode.Accepted, createdProduct, GlobalConfiguration.Configuration) – asa

risposta

215

Un altro modo per risolvere questo è quello di effettuare le seguenti operazioni:

controller.Request = new HttpRequestMessage(); 
controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, 
            new HttpConfiguration()); 

Se si esegue l'aggiornamento a WebAPI 5.0, quindi avrete bisogno di cambiare questo a:

controller.Request = new HttpRequestMessage(); 
controller.Request.SetConfiguration(new HttpConfiguration()); 

Il motivo per cui devi farlo perché devi avere Request popolato sul controller altrimenti i metodi di estensione su Request non funzioneranno. Devi anche avere un HttpConfiguration impostato su Richiesta altrimenti il ​​routing e altre parti della pipeline non funzioneranno correttamente.

+0

Sì, potrebbe funzionare anche, ma sembra che anche Request.CreateResponse funzioni. – asa

+4

Aggiunta di GlobalConfiguration.Configuration rimane ancora richiesta nullo. L'impostazione della richiesta ha funzionato per me, tuttavia questa non era la fine dei miei problemi poiché la mia azione stava chiamando anche Url.Link e il nome della rotta non era definito. – foolshat

+0

Aiuto per impostare il percorso http://stackoverflow.com/questions/11779311/testing-webapi-controller-url-link – foolshat

20

È possibile impostare l'oggetto controller per testability come questo:

var config = new HttpConfiguration(); 
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/products"); 
var route = config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"); 
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } }); 

controller.ControllerContext = new HttpControllerContext(config, routeData, request); 
controller.Request = request; 
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 

copiato dal blog post completo di Peter Provost su Unit Testing ASP.NET Web API.

0

WebAPI 1 qui con un problema simile con VB.

sono riuscito a risposte ibride qui per arrivare a questo lavoro semplice come questo:

Dim request As HttpRequestMessage = New HttpRequestMessage() 
Return request.CreateResponse(HttpStatusCode.BadRequest, myCustomClassObject, GlobalConfiguration.Configuration) 

Proprio distacco in caso aiuta nessuno.

0

Nella classe di test, creare un'istanza della classe controller. es var customerController= new CustomerController();

customerController.Request = new HttpRequestMessage(); 
customerController.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration()); 
Problemi correlati