Request.CreateResponse ile ASP.NET WebApi birim testi


149

ApiController'im için bazı birim testleri yazmaya çalışıyorum ve bazı sorunlarla karşılaştım. Yanıt oluşturmada çok yardımcı olan Request.CreateResponse adlı güzel bir genişletme yöntemi vardır.

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

Kısmi taklitler kullanmadan veya "yeni HttpResponseMessage (...)" kullanmadan CreateResponse ile dalga geçmenin bir yolu var mı?


1
Neden dalga geçmek istiyorsun CreateResponse? Neden döndürülen HttpResponseMessage Contentve StatusCodeözellikler üzerinde doğru değerlerin ayarlandığını iddia etmiyorsunuz ?
nemesv

3
Bu yöntemi birim testlerinden çalıştırırsam, yapılandırmanın ayarlanmaması dışında başarısız olur.
asa

1
Tamam, yazıklar olsun bana, sadece bunu yazmam gerekiyordu.Request.CreateResponse (HttpStatusCode.Accepted, createdProduct, GlobalConfiguration.Configuration)
asa

Yanıtlar:


244

Bunu çözmenin başka bir yolu da aşağıdakileri yapmaktır:

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

Webapi 5.0'a yükseltiyorsanız, bunu şu şekilde değiştirmeniz gerekir:

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

Bunu yapmanız gerekmesinin nedeni Request, denetleyicide doldurmanız gerekmesidir, aksi halde uzatma yöntemleri Requestçalışmayacaktır. Ayrıca HttpConfigurationİstek üzerinde bir setiniz olması gerekir , aksi takdirde yönlendirme ve boru hattının diğer bölümleri düzgün çalışmayacaktır.


Evet, bu da işe yarayabilir, ancak öyle görünüyor ki Request.CreateResponse de çalışıyor.
asa

4
GlobalConfiguration.Configuration ekleniyor hala istek boş bırakılıyor. İsteği ayarlamak benim için işe yaradı, ancak bu, benim Eylemim de Url.Link'i çağırdığından ve rota adı tanımlanmadığından sorunlarımın sonu değildi.
foolshat


ControllerContext'i bu aramadan sonra ayarlamak bana da bu hatayı veriyor, ancak yalnızca WebApi 5.0.0 ile. Ancak HttpConfiguration nesnesini en son İstek üzerine ayarlarsam, iyi çalışıyor.
mikebridge

Bu mükemmel çalışıyor, ancak bunun neden işe yaradığını anlayamıyorum. Bunu cevapta detaylandırır mısınız?
Jan_V

24

Denetleyici nesnesini şu şekilde test edilebilirlik için ayarlayabilirsiniz:

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;

Peter Provost'un Unit Testing ASP.NET Web API hakkındaki kapsamlı blog gönderisinden kopyalandı .


1
Bununla ilgili MS belgeleri de ilginizi çekebilir : docs.microsoft.com/en-us/aspnet/web-api/overview/… Ayrıca System.Web.Http ve System.Net'e referanslar eklemeniz gerekebilir. Http
Aaron Hoffman

5

Web API 2 için basitçe ekleyebilirsiniz

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

Öyle gibi

[TestMethod]
public void GetReturnsProduct()
{
    // Arrange
    var controller = new ProductsController(repository);
    controller.Request = new HttpRequestMessage();
    controller.Configuration = new HttpConfiguration();

    // Act
    var response = controller.Get(10);

    // Assert
    Product product;
    Assert.IsTrue(response.TryGetContentValue<Product>(out product));
    Assert.AreEqual(10, product.Id);
}

Denetleyicide İstek ve Yapılandırmayı ayarlamak önemlidir. Aksi takdirde, test bir ArgumentNullException veya InvalidOperationException ile başarısız olur.

Daha fazla bilgi için buraya bakın .


1

VB kullanarak benzer bir sorunla birlikte WebAPI 1 burada.

Bunun bu kadar basit çalışmasını sağlamak için yanıtları burada hibritlemeyi başardım:

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

Sadece kimseye yardımcı olma ihtimaline karşı yayınlamak.


1

Test sınıfınızda, denetleyici sınıfının bir örneğini oluşturun. Örneğinvar customerController= new CustomerController();

customerController.Request = new HttpRequestMessage();
customerController.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.