次のようなインターフェースがあります
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);