Moq可以返回传递给在Mock上调用的带有void返回类型的Setup方法的真实对象实例吗?

本文关键字:Setup 返回类型 void 方法 真实 实例 对象 Moq 返回 调用 Mock | 更新日期: 2023-09-27 18:09:07

我有这样一个电话:

_session.Setup(session => session.SaveOrUpdate(It.IsAny<Foo>()))

我想检索在运行测试进行验证时传递给SaveOrUpdateFoo的任何实例的副本。我怎样才能在我的测试中得到一份完全相同的Foo副本?

我试图使用.Callback,但也许这不是这样做吗?也许是我做错了……不确定,但我可以使用一些帮助试图弄清楚这是否可能以及如何做到这一点,请。

Foo foo;
_session.Setup(session => session.SaveOrUpdate(It.IsAny<Foo>()))
        .Callback<Foo>(fooInstanceBeingSaved => foo = fooInstanceBeingSaved as Foo);

在这个场景中,foo总是返回null,即使在服务层中填充了真正的foo

编辑:这不是上述副本的副本,因为这个问题的不同之处在于SaveOrUpdate返回void。在据称是重复的文章中,这些方法返回的不是void。因此,我需要从"Returns"不是有效选项的方法中获取变量—这是其他文章中的解决方案。

Moq可以返回传递给在Mock上调用的带有void返回类型的Setup方法的真实对象实例吗?

在这里引导一些精神力量…

看起来你可能在使用NHibernate,如果是这样的话,这意味着SaveOrUpdate有这个签名:

void SaveOrUpdate(object obj);
因此,为了获得Foo对象,你需要指定object作为类型参数,例如:
_session.Setup(session => session.SaveOrUpdate(It.IsAny<object>()))
        .Callback<object>(objectBeingSaved => foo = objectBeingSaved as Foo);