コーヒー飲みながら仕事したい

仕事で使う技術的なことの備忘録とか

単体テスト<C#> async な moq をセットアップするときにハマったこと

C#単体テストで moq を使用した場合のお話です。
備忘録として残しておきます。

以下のようなインターフェイスがあったとします。

public interface IHoge
{
    Task SomethingAsync(int x);
}

これを moq でセットアップする場合、以下のように書く必要があります。

Mock<IHoge> hogeMock= new Mock<IHoge>();

hogeMock.Setup(m => m.SomethingAsync(It.IsAny<int>())).Callback<int>((value) =>
    {
         // Assert.Equal 等の何かしらの処理をここに記述
    }).Returns(Task.CompletedTask);

重要なのが .Returns(Task.CompletedTask) の部分で、 Task async で実装されるメソッドにはこれをセットアップする必要があります。
でないと、メソッドをコールしても NullReferenceException の例外が投げられてしまいます。
なんとも不親切な例外なので、かなりハマりました・・・