Я пытаюсь прокси-вызовов на поддельный объект на фактическую реализацию. Причина этого заключается в том, что я хочу иметь возможность использовать методы 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
Спасибо, Оберточный подход решает мою проблему. –