FakeItEasy - 在呼叫拦截期间模拟 return 值

FakeItEasy - Mock the return value during the call interception

能否请您帮助我了解 fakeItEasy 的高级用法。 我得到了将参数作为参数的方法(假设它称为“插入”)。这个参数充满了数据(很多)。 我想 return 这个参数作为“插入”的结果。

object.Insert(A<T>._))
.Invokes(obj =>
{
   var p = obj.GetArgument<T>(0);
   ---SET p AS a return value here--
}

类似的东西。 有可能吗?

我试过了

A.CallTo(() => obj.Insert(A<T>._)).ReturnsLazily((o) => o.GetArgument<T>(0);

也不行。在调试中它并没有就此停止。可能它根本没有被调用。

提前致谢。

正如 Alexander Petrov 所说,这应该可行,但您的代码过于简洁,无法确定。我会复制我已经在 FakeItEasy gitter 聊天中输入给你的答案:

你的代码有点简洁,所以有些细节我不得不猜测。最好包含更多内容,并且 or/describe 到底发生了什么,但是您的第二种方法对我来说听起来不错,尽管它比需要的要复杂一些。我会自己写这段代码:

A.CallTo(() => fake.Insert(A<TypeOfP>._).ReturnsLazily((TypeOfP p) => p));

其中 TypeOfP 是参数的类型。这正是 Return Values Calculated at Call Time.

中描述的方法

如果这对您不起作用,我要做的第一件事就是确保您配置的方法正确。您是否在参数列表中使用了正确的类型?是否有 Insert 的重载需要更多(或更少)您在生产代码中实际调用的参数,因此单参数版本(需要 TypeOfP)实际上并不是叫什么?有时这很容易通过视觉检查,或者有时它可以帮助调试代码。

如果您能够提供更多的测试和生产代码,或者至少提供方法签名,如果您仍然遇到困难,我们可能会提供帮助。