Moq にタスクを返すように指示するにはどうすればいいですか? 質問する

Moq にタスクを返すように指示するにはどうすればいいですか? 質問する

次のようなインターフェースがあります

Task DoSomethingAsync();

私はテストに MoqFramework を使用しています:

[TestMethod()]
public async Task MyAsyncTest()
{
   Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
   mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
   ...
}

次に、テストで を呼び出すコードを実行しますawait DoSomethingAsync()。そして、その行でテストが失敗します。何が間違っているのでしょうか?

ベストアンサー1

メソッドにはコールバックがないので、 を使用する理由はありません。と.CallBack()を使用して、必要な値を持つ Task を返すだけです。.Returns()タスク.FromResult例:

MyType someValue=...;
mock.Setup(arg=>arg.DoSomethingAsync())        
    .Returns(Task.FromResult(someValue));

2014-06-22更新

Moq 4.2 には、これを支援する 2 つの新しい拡張メソッドがあります。

mock.Setup(arg=>arg.DoSomethingAsync())
    .ReturnsAsync(someValue);

mock.Setup(arg=>arg.DoSomethingAsync())        
    .ThrowsAsync(new InvalidOperationException());

2016-05-05 更新

セス・フラワーズが言うようにその他の回答は、ReturnsAsyncを返すメソッドでのみ使用できますTask<T>。 Task のみを返すメソッドの場合、

.Returns(Task.FromResult(default(object)))

に使える。

に示すようにこの答え.NET 4.6 では、これは.Returns(Task.CompletedTask);次のように簡略化されます。

mock.Setup(arg=>arg.DoSomethingAsync())        
    .Returns(Task.CompletedTask);

おすすめ記事