2017-05-16 7 views
2

現在、ASP.NETコアプロジェクトで単体テストを実装しており、APIコントローラのPOSTメソッドをテストする必要があります。ここでPOSTメソッドの例です。ASP.NETコアを使用した単体テストでのPOST要求のシミュレート

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

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

を主なアイデアが両方作成したテスト(201)とも不正な要求することです:

[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(); 
    } 

} 

そして、ここでは、私が使用していたモデルの一例です(400)結果が得られる。私はthis pageに行き、Created(201)はうまく動作します。しかし、私がBad Request(401)に同じロジックを適用したとき、実際のリクエストをしていないので動作しませんでした。しかし、 "間違った"値でPostManを使用しようとすると、予想どおり400になった。

単体テストからPOSTリクエストをシミュレートするにはどうすればよいですか?または私は何かを逃していますか?

+1

ASP.NET Coreの場合は、このドキュメントを参照してください。ここには、ユニットテストコントローラに関するセクションがあり、POSTを使用した例があります。https://docs.microsoft.com/en-us/aspnet/core/ mvc/controllers/testing – Svek

+0

情報をありがとう@Svek!私は完全に "controller.ModelState.AddModelError"を忘れていました。これは間違いなく助けになるでしょう! –

+1

助けてくれてうれしいです。 – Svek

答えて

2

ASP.NETコアではなく、従来のASP.NETドキュメントにリンクします。 ASP.NETコア内のコントローラのテストのために設計されTestServerクラスがあります:

_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を内部に作成します。そのハンドラは、HTTPサーバとして公開することなく、テスト対象のAPIを直接呼び出すことができます。

統合テストに適した別のオプションは、実際のKestrelサーバーをテストしてテストすることです。

+0

こんにちはIlya、情報ありがとう。私はユニットx統合テストのコンセプトを見逃していたと思いますが、今はすべて明らかです。 –

+1

答えには、 'content'についての情報が含まれているはずです。 –

関連する問題