2017-05-16 117 views
2

我目前正在ASP.NET Core項目中實現單元測試,並且必須測試API控制器的POST方法。這裏是POST方法的一個例子:使用ASP.NET Core在單元測試中模擬POST請求

[HttpPost] 
public IActionResult Post([FromBody]Product product) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(); 
    } 

    try 
    { 
     var returnValue = productService.Save(product); 
     return CreatedAtRoute(nameof(Post), new { returnValue = returnValue }, product); 
    } 
    catch 
    { 
     return BadRequest(); 
    } 

} 

這裏是我使用的模型的例子:

public class Product 
{ 
    [Required] 
    [MaxLength(25)] 
    public string Name { get; set; } 

    [MaxLength(200)] 
    public string Description { get; set; } 
} 

的主要思想是,以測試兩個創建(201)也無效請求(400)結果。我經歷了this page,Created(201)的工作非常好。但是,當我將錯誤請求(401)應用於相同的邏輯時,它不起作用,因爲我沒有提出真正的請求。但是,當我嘗試使用PostMan的「錯誤」值時,我得到了400,正如預期的那樣。

如何模擬單元測試的POST請求?或者我錯過了什麼?

+1

對於ASP.NET Core,您可能需要查看此文檔,其中包含有關使用POST示例的單元測試控制器的一部分https://docs.microsoft.com/zh-cn/aspnet/core/ mvc/controllers/testing – Svek

+0

感謝您的信息,@Svek!我完全忘了「controller.ModelState.AddModelError」。這一定會有所幫助! –

+1

很高興有幫助。 – Svek

回答

2

您鏈接到傳統的ASP.NET文檔而不是ASP.NET Core。有TestServer類ASP.NET核心設計的控制器測試:

_server = new TestServer(new WebHostBuilder() 
    .UseStartup<Startup>()); 
_client = _server.CreateClient(); 

HttpResponseMessage response = await _client.PostAsync("foo_path", content); 

檢查文檔:Integration testing

備註:

  • TestServerStartup類參數化。可能你會創建一個單獨的Startup類來測試或以某種方式重寫它的方法來模擬依賴關係。

  • 服務器實例只能從由_server.CreateClient()調用創建的客戶端訪問。客戶端內部創建了一個特殊的HttpMessageHandler。該處理程序允許直接調用被測試的API,而不會將其暴露爲HTTP服務器。

另一種適合集成測試的選擇是運行「真正的」Kestrel服務器來測試它。

+0

嗨伊利亞,感謝您的信息。我想我錯過了Unit x Integration測試的全部概念,但現在一切都清楚了。 –

+1

答案應該包含一些關於「內容」的信息。 –