【问题标题】:Can Moq return the real object instance passed into a Setup method called on a Mock with a void return type?Moq 是否可以返回传递给 Setup 方法的真实对象实例,该方法在具有 void 返回类型的 Mock 上调用?
【发布时间】:2014-06-17 22:19:11
【问题描述】:

我有这样的电话:

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

当运行测试进行验证时,我想检索传递给SaveOrUpdate 的任何Foo 实例的副本。如何在我的测试中获得准确的 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。因此,我需要从“返回”不是有效选项的方法中获取变量 - 这是其他文章中的解决方案。

【问题讨论】:

  • 看起来不错。您确定 foo 为 null 是因为未调用回调吗?还是因为as 正在返回null?可以在回调 lambda 中放一个断点来检查吗?
  • 是的,foo 将返回 null。即使我把它作为一个没有任何强制转换/“as”的对象。

标签: c# moq


【解决方案1】:

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

您可能正在使用NHibernate,如果是这样,则意味着SaveOrUpdate 具有此签名:

void SaveOrUpdate(object obj);

因此,为了获取您的 Foo 对象,您需要将 object 指定为类型参数,例如:

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

【讨论】:

  • 啊,我以前没想过将 IsAny 更改为 IsAny。这现在有效。谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-11-25
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2014-08-24
  • 2017-03-17
相关资源
最近更新 更多