2015-01-13 8 views
5

私は実際の実装に対して偽のオブジェクトへの呼び出しをプロキシしようとしています。これは、インターフェイスタイプの偽物に対してのみ機能するMachine.SpecificationsのWasToldToとWhenToldToを使用できるようにするためです。FakeItEasyプロキシメソッドが実際の実装を呼び出す

したがって、私は実際のオブジェクトへのすべての呼び出しをプロキシするために次のことを行います。

public static TFake Proxy<TFake, TInstance>(TFake fake, TInstance instance) where TInstance : TFake 
{ 
    fake.Configure().AnyCall().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray())); 
    return fake; 
} 

このように使用します。

var fake = Proxy<ISomeInterface, SomeImplementation>(A.Fake<ISomeInterface>(), new SomeImplementation()); 

//in my assertions using Machine.Specifications (reason I need a fake of an interface) 
fake.WasToldTo(x => x.DoOperation()); 

しかし、この問題は、Invokesメソッドが戻り値で何も実行していないため、voidメソッドでのみ機能することになります。 (Funcの代わりにAction param)

次に、私はWithReturnValueメソッドを使ってこれをしようとしていました。

public static TFake Proxy(TFake fake, TInstance instance) where TInstance : TFake 
{ 
    fake.Configure().AnyCall()..WithReturnType().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray())); 
    fake.Configure().AnyCall()..WithReturnType().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray())); 
    fake.Configure().AnyCall()..WithReturnType().Invokes(x => x.Method.Invoke(instance, x.Arguments.ToArray())); 
    //etc. 
    return fake; 
} 

しかし、Invokesメソッドはまだ私が望む方法では機能しません(FuncではなくActionです)。したがって、戻り値はまだ使用されていません。

これを最新の最新バージョンで実現する方法はありますか?

私はすでにFakeItEasy githubリポジトリに問題を提出しました。 https://github.com/FakeItEasy/FakeItEasy/issues/435

答えて

4

response at the FakeItEasy github repositoryから盗む:

あなたがそうのような既存のオブジェクトラップする偽作成することができます。

var wrapped = new FooClass("foo", "bar"); 
var foo = A.Fake<IFoo>(x => x.Wrapping(wrapped)); 

Creating Fakes > Explicit Creation Optionsから取られた例を)

デリゲートは、すべての必要があることリダイレクトされた呼び出しはすべてoverrideableでなければならないという通常の注意で、基になるオブジェクトへの呼び出し。

こちらがお役に立てば幸いです。そうでなければ、もう一度説明してください。多分私はそれをよりよく理解するでしょう。

ああ、Configureメカニズムに注意してください。それはFakeItEasy 2.0.0で廃止される予定です。 好きなイディオムは

A.CallTo(fake).Invokes(…); // or 
A.CallTo(fake).WithReturnType<bool>(…); 
+0

です。ありがとう、ラッピングのアプローチは私の問題を解決します。 –

関連する問題