2015-01-13 21 views
5

Sto provando a trasferire le chiamate a un oggetto falso all'implementazione effettiva. La ragione di questo è che voglio essere in grado di utilizzare WasToldTo e WhenToldTo di Machine.Specifications che funziona solo su falsi di un tipo di interfaccia.Metodi del proxy FakeItEasy chiamate all'implementazione reale

Pertanto, eseguo le operazioni seguenti per trasferire tutte le chiamate al mio oggetto reale.

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; 
} 

Vorrei usarlo così.

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()); 

Il problema però è che questo funziona solo per i metodi vuoti, dal momento che il metodo richiama non sta facendo nulla con il valore di ritorno. (Parametro di azione anziché Func)

Quindi stavo cercando di farlo utilizzando il metodo 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; 
} 

Tuttavia, il metodo richiama ancora non funziona il modo in cui lo voglio (ancora azione invece di Func). Quindi il valore di ritorno non è ancora utilizzato.

C'è un modo per raggiungere questo con l'ultima versione attuale?

Ho già archiviato un problema nel repository github FakeItEasy. https://github.com/FakeItEasy/FakeItEasy/issues/435

risposta

4

Rubare dal mio response at the FakeItEasy github repository:

È possibile creare un falso per avvolgere un oggetto esistente in questo modo:

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

(esempio tratto dalla Creating Fakes > Explicit Creation Options)

Che dovrebbe delegato tutto chiama all'oggetto sottostante, con il solito avvertimento che ogni chiamata reindirizzata deve essere overrideable.

Spero che questo aiuti. Altrimenti, torna indietro e spiega di nuovo. Forse lo capirò meglio.

Oh, e attenzione al meccanismo Configure. Sta andando via in FakeItEasy 2.0.0. L'idioma preferito è

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

Grazie, L'approccio di avvolgimento risolve il problema. –