モッキング ライブラリMoqには、署名付きの Setup() メソッドがあります。
public ISetup<T, TResult> Setup<TResult>(Expression<Func<T, TResult>> expression)
だから私はこのようなことをうまくやることができます(ライブラリの再帰的モックを使用して):
Mock<Thing> _thing = new Mock<Thing>();
_thing.Setup((Thing t) => t.PropA.SubPropB).Returns(string.Empty);
しかし、これは失敗します:
Expression<Func<Thing, object>> test = (Thing t) => t.PropA.SubPropB;
_thing.Setup(test).Returns(string.Empty);
エラーで:
Expression is not a method invocation: t => (Object)t.PropA.SubPropB
インライン化されたラムダと最初に変数に割り当てられたラムダの違いは何ですか? 式ツリーと未コンパイルの両方ではありませんか (Moq はツリーを解析します)。
編集 - 問題はFunc<Thing, object>
タイピングにあるようです。たとえば、string
受け入れられるのに、受け入れられないのobject
はなぜですか?