2015-01-13 4 views
5

Я пытаюсь прокси-вызовов на поддельный объект на фактическую реализацию. Причина этого заключается в том, что я хочу иметь возможность использовать методы WasToldTo и WhenToldTo of Machine.Specifications, которые работают только на подделках типа интерфейса.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()); 

Однако проблема в том, что это работает только для пустых методов, так как метод Запускает имеет ничего с возвращаемым значением не делает. (Параметр действия вместо Func)

Затем я пытался это сделать с помощью метода 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). Таким образом, возвращаемое значение все еще не используется.

Есть ли способ достичь этого с помощью последней версии?

Я уже зарегистрировал проблему в репозитории 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

Спасибо, Оберточный подход решает мою проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^