Returnsasync(null) は、VS15 で Moq を単体テストに使用するとビルド エラーをスローします。質問する

Returnsasync(null) は、VS15 で Moq を単体テストに使用するとビルド エラーをスローします。質問する

ReturnsAsync(null)Visual Studio の C# ユニット テスト メソッドで を使用すると( を使用Moq)、次のエラーが発生します。

「次のメソッドまたはプロパティ間の呼び出しがあいまいです」

そして、ReturnsAsync異なるパラメータを持つメソッドのリストが表示されます。これは関数がオーバーロードされているためだと理解していますReturnsAsync。しかし、同僚のコンピューターで同じユニット テストを実行すると、エラーなしで実行されます。なぜこのようなことが起こるのか、誰か知っていますか? これを修正する方法を知っている人はいますか?

また、ビルド時に次のような警告が表示されます:

******** を参照するすべてのパッケージは、nuget パッケージ Microsoft.Bcl.Build をインストールする必要があります。

それは何か効果があるのでしょうか?

ベストアンサー1

ReturnsAsyncMoqReturnsExtensionsクラスには2 つの拡張メソッドがあります。次のパラメーターがあります。

(this IReturns<TMock, Task<TResult>> mock, TResult value)
(this IReturns<TMock, Task<TResult>> mock, Func<TResult> valueFunction)

ご覧のとおり、1 つはタスクによって返される値を受け入れ、もう 1 つは値を返すデリゲートを受け入れます。nullコンパイラに渡すとき、それが値かデリゲートかはわかりません。タスク パラメータが値型 (例: int) の場合は当てはまりません。これは、null にできず、コンパイラは null がデリゲートであると理解するためです。おそらく、同僚のコンピュータの場合はそうでしょう。

このエラーを修正するには、コンパイラが正しいメソッド オーバーロードを選択できるようにする必要があります。つまり、null をタスクの結果の型 (例: 文字列) にキャストします。

RetursAsync((string)null)

またはnullの値を渡すこともできます

string s = null;
... ReturnsAsync(s);

おすすめ記事