単体テスト<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 の例外が投げられてしまいます。
なんとも不親切な例外なので、かなりハマりました・・・

コメント

タイトルとURLをコピーしました