1. ホーム
  2. c#

[解決済み] Moqにタスクを返すように指示するにはどうしたらいいですか?

2022-03-22 22:51:30

質問

を宣言したインタフェースがあります。

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() . そして、テストはその行でちょうど失敗します。私は何を間違えているのでしょうか?

どうすればいいですか?

あなたのメソッドにはコールバックがないため、このメソッドに .CallBack() . を使用して、必要な値でタスクを返すことができます。 .Returns() タスク.フロムリザルト , 例:

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> . タスクのみを返すメソッドの場合。

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

が使用できます。

で示したように 本解答 .NET 4.6では、これは次のように簡略化されています。 .Returns(Task.CompletedTask); , 例:

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