[解決済み] IActionResultを返すコントローラのメソッドのユニットテスト
2023-05-29 02:56:46
質問
ASP.NET Core WebAPIを構築している最中で、コントローラのユニットテストを書こうとしています。 私が見つけたほとんどの例は、古いWebAPI/WebAPI2プラットフォームからのもので、新しいCoreコントローラと相関していないようです。
私のコントローラのメソッドは
IActionResults
. しかし
IActionResult
オブジェクトには
ExecuteResultAsync()
メソッドだけがあり、これはコントローラコンテキストを必要とします。 コントローラを手動でインスタンス化しているので、 このインスタンスのコントローラコンテキストはnullです。
ExecuteResultAsync
. 基本的に、これはユニットテストを正常に完了させるために非常に面倒な経路をたどっており、非常に厄介なことなのです。APIコントローラをテストする、よりシンプルで正しい方法があるはずだと、私は思っています。
また、私のコントローラはasync/awaitを使用していないので、もし違いがあるとすれば。
私が達成しようとしていることの簡単な例です。
コントローラーのメソッドです。
[HttpGet(Name = "GetOrdersRoute")]
public IActionResult GetOrders([FromQuery]int page = 0)
{
try
{
var query = _repository.GetAll().ToList();
int totalCount = query.Count;
int totalPages = (int)Math.Ceiling((double)totalCount / pageSize) - 1;
var orders = query.Skip(pageSize * page).Take(pageSize);
return Ok(new
{
TotalCount = totalCount,
TotalPages = totalPages,
Orders = orders
});
}
catch (Exception ex)
{
return BadRequest(ex);
}
}
ユニットテストです。
[Fact]
public void GetOrders_WithOrdersInRepo_ReturnsOk()
{
// arrange
var controller = new OrdersController(new MockRepository());
// act
IActionResult result = controller.GetOrders();
// assert
Assert.Equal(HttpStatusCode.OK, ????);
}
どのように解決するのですか?
のようなものがあると仮定して
public IActionResult GetOrders() {
var orders = repository.All();
return Ok(orders);
}
この場合、コントローラは
OkObjectResult
クラスを返します。
結果をメソッドで返しているものの型にキャストし、それに対してアサートを実行します。
[Fact]
public void GetOrders_WithOrdersInRepo_ReturnsOk() {
// arrange
var controller = new OrdersController(new MockRepository());
// act
var result = controller.GetOrders();
var okResult = result as OkObjectResult;
// assert
Assert.IsNotNull(okResult);
Assert.AreEqual(200, okResult.StatusCode);
}
関連
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】Swashbuckle/Swagger + ASP.Net Core: "Failed to load API definition" (API定義の読み込みに失敗しました
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み] C# "internal "アクセス修飾子でユニットテストを行う場合
-
[解決済み] プライベートメソッドのユニットテストはどのように行うのですか?
-
[解決済み】voidメソッドのユニットテスト?
-
[解決済み] 明示的に型付けされた ASP.NET Core API コントローラから 404 を返す (IActionResult ではない)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】Nullableオブジェクトは値を持たなければならない?