はじめに
みなさま。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
の戻り値をブレークポイントで止めて確認してみます。
result.Result.Value
にアクセスすればうまくいきそうですね!
それではコードを修正して確認してみましょう。
意図通りList<T>
型で取り出すことができました。
やり方さえ分かっていれば2行に分ける必要もないので1行にまとめてもいいと思います。
またそもそもメソッド実行時にawait
を付けると戻り値がActionResult<T>
型になるため.Value
を付けるだけでリストの取得ができるようになります(おそらくこっちのほうがメジャー?)。
注意点としてその際にはテストメソッドの戻り値をvoid
からTask
型に変えないとテストエクスプローラー上で実行したときに実行結果を受け取ることができません。
終わりに
戻り値の内容の検証ができるように変換する方法を紹介しました。レスポンス結果の検証方法についてもいつか記事にしたいです。
参考
※Web API 2のテスト