FakeItEasy Proxy 方法调用真实实现

FakeItEasy Proxy methods calls to real implementation

我正在尝试将对假对象的调用代理到实际实现。这样做的原因是我希望能够使用 Machine.Specifications 的 WasToldTo 和 WhenToldTo,它们仅适用于接口类型的假货。

因此我正在执行以下操作来代理对我的真实对象的所有调用。

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

然而,问题在于这仅适用于 void 方法,因为 Invokes 方法未对 return 值执行任何操作。 (动作参数而不是 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 方法仍然无法按我想要的方式工作(仍然是 Action 而不是 Func)。所以return值还是没有用到

有没有办法用当前的最新版本实现这个?

我已经在 FakeItEasy github 存储库中提交了一个问题。 https://github.com/FakeItEasy/FakeItEasy/issues/435

偷了我的 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>(…);