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>(…);
我正在尝试将对假对象的调用代理到实际实现。这样做的原因是我希望能够使用 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>(…);