くうと徒然なるままに

ゆるふわ を志向している なごやかです。

ASP.NET Core の単体テストで IActionResult からステータスコードを判定する

ASP.NET Core の Controller で IActionResult な戻り値になっている関数はよくあります。

そんな Controller の戻り値を単体テストで呼び出すときに ステータスコードを判定したい というのはよくあると思います。

解決方法

Controller のメソッドの戻り値を OK(200) の場合は、 OkObjectResult にキャストします。 C# の is キーワードを使うことで、キャストできるか判定することができます。

コード

public class hoge
{
    public class HogeController
    {
        [HttpGet()]
        public IActionResult<String> LoadGreeting() => OK("Hello World");
    }

    [Fact]
    public void IActionResultをテストするよー()
    {
        var hogeController = new HogeController();

        var greetingResult = hogeController.LoadGreeting();

        // True のテストケースが通った場合は、 希望するステータスコードになっている。
        Assert.True(greetingResult is OkObjectResult);
        // 指定するステータスコードになっていないことを確かめている
        Assert.False(greetingResult is NotFoundObjectResult);

        // 返ってきた値自体を確かめたい場合は、 as なりを使ってキャストしてあげる必要がある。
        var responseObject = greetingResult as OkObjectResult;

        Assert.NotNull(responseObject);
        // .Value で値にアクセスすることができるが、Object型なのでキャストしてから利用する
        Assert.Equals("Hello World", (String)responseObject.Value);
    }
}