0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【C#】Task<ActionResult<IEnumerable<T>>>型を戻すメソッドの単体テスト方法

Posted at

はじめに

みなさま。WebAPIを使っていますでしょうか?
SPAを使用するとほぼ必ず使うことになるWebAPIについて、C#で作成するときにはAsp.net CoreのWebAPIを使って下記のような形実装することが多いと思います。
※下記の例はVisual Studioのスキャフォールディング機能で自動実装したものです。

// GET: api/Students
[HttpGet]
public async Task<ActionResult<IEnumerable<Students>>> GetStudents()
{
    return await _context.Students.ToListAsync();
}

ただそうなった時に1つ問題になるのが「単体テスト時にどうするか?」です。
具体的にはTask<ActionResult<IEnumerable<Students>>>型の戻り値をどうやってテストすればいいのかという点になります。

今回は単体テスト時にTask<ActionResult<IEnumerable<T>>>の戻り値から扱いやすいList<T>へ変換してテストする方法をご紹介します。

この記事で扱わないこと

  • APIの作成方法
  • MSTestの記載方法
  • APIのレスポンスがOKか?NotFoundか?などの検証
  • DBや外部に依存している箇所のモックについて

環境

  • Windows11
  • Visual Studio 2022
  • .NET 8

本題

テスト対象のAPIについてよくある戻り値であるTask<ActionResult<IEnumerable<T>>>を想定します。

実際にDBにつながっているとモックとかが面倒になるので新規のリストを返すように書き換えてありますが挙動としては一緒です。

[HttpGet(Name = "GetRecords")]
public async Task<ActionResult<IEnumerable<StudyRecord>>> GetAllStudyRecords()
{
    return new List<StudyRecord>{
        { new StudyRecord { Id = 1, Title = "Test1", Time = 1 } },
        { new StudyRecord { Id = 2, Title = "Test2", Time = 2 } },
        { new StudyRecord { Id = 3, Title = "Test3", Time = 3 } }
    };
 }

この時のGetAllStudyRecordsの戻り値をブレークポイントで止めて確認してみます。

image.png

image.png

result.Result.Valueにアクセスすればうまくいきそうですね!
それではコードを修正して確認してみましょう。

image.png

image.png

意図通りList<T>型で取り出すことができました。
やり方さえ分かっていれば2行に分ける必要もないので1行にまとめてもいいと思います。

またそもそもメソッド実行時にawaitを付けると戻り値がActionResult<T>型になるため.Valueを付けるだけでリストの取得ができるようになります(おそらくこっちのほうがメジャー?)。

注意点としてその際にはテストメソッドの戻り値をvoidからTask型に変えないとテストエクスプローラー上で実行したときに実行結果を受け取ることができません。

終わりに

戻り値の内容の検証ができるように変換する方法を紹介しました。レスポンス結果の検証方法についてもいつか記事にしたいです。

参考

※Web API 2のテスト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?