0

現在

私はMoqいくつかのモック オブジェクトを作成するために使用しています。これまでのところ、すべてがうまく機能しています。現在、私がやっているMoqを使用してデリゲートを「割り当てる」

var someMock = new Mock<ISomeInterface>();
someMock.Setup(x => x.DoSomething(It.IsAny<int>())).Returns(this.DoSomething)

パラメータthis.DoSomethingを受け取るメソッドはどこにありますか。int基本的には と同じ構造x.DoSomethingですISomeInterface

質問

すべてのパラメーターを指定する必要なく、つまりを使用 It.IsAny<int>()せずに、単にデリゲートを割り当てることは可能ですか? 理想的には、次のようなものです。

var someMock = new Mock<ISomeInterface>();
someMock.Setup(x => x.DoSomething).Returns(this.DoSomething)
4

1 に答える 1

1

いいえ、それは不可能です。これはMoqの「欠点」ではありません-C#はそれをサポートしていません。

いくつかの背景:

ISomeInterface次のように宣言されていると仮定しましょう。

public interface ISomeInterface
{
    void Foo(int a, int b);
}

Setupこれは、メソッドのパラメーターがである必要があることを意味しますFunc<ISomeInterface, Action<int, int>>
ここでの問題は、Setupメソッドが任意のタイプのパラメーターを持つ可能性があるため、メソッドを一般的な方法で定義する必要があることです。

Setup<T1, T2>(Func<T, Action<T1, T2>> param)

TはMockクラスのジェネリック型でT1ありT2、メソッドのパラメーターです。

ただし、このメソッドを呼び出すと、コンパイラエラーが発生します。

メソッドの型引数はMock.Setup<T1, T2>(System.Func<UserQuery.ISomeInterface,System.Action<T1,T2>>)、使用法から推測することはできません。タイプ引数を明示的に指定してみてください。

それを機能させるには、次のように呼び出す必要があります。

someMock.Setup<int, int>(x => x.DoSomething)

またはこのように:

someMock.Setup(x => (Action<int, int>)x.DoSomething);

どちらの場合も、すでに行っているように、パラメーターのタイプを指定する必要があります。

コンパイラエラーが発生する理由について:

x.DoSomethingメソッドグループです。への暗黙の変換が存在しAction<int, int>ます。
ただし、この暗黙的な変換を実行するには、コンパイラがとのタイプを知っている必要がT1ありT2ます。ただし、これらのタイプは、変換が行われた後にのみ推測できます。
これらの2つのステップは相互に依存しているため、機能しません。

于 2013-02-12T11:44:09.473 に答える