【问题标题】:How to setup Mock to already present object as defaul behavior?如何将 Mock 设置为已经将对象呈现为默认行为?
【发布时间】:2020-09-20 23:49:34
【问题描述】:

我可以这样做:

var alreadyPresentMyClass = GetMyClass();//retrieving MyClass from somewhere

var mock = new Mock<IMyClass>();
mock.Setup(x=> x.Method1()).Callback(alreadyPresentMyClass.Method1);
mock.Setup(x=> x.Method2()).Callback(alreadyPresentMyClass.Method2);
....
mock.Setup(x=> x.Method666()).Throws(new Exception("BAD LUCK")); //this is only method which is throwing error in this test. So the only one I want to setup.
....
mock.Setup(x=> x.Method1000()).Callback(alreadyPresentMyClass.Method1000);

如何消除设置数千个方法的不必要垃圾,而是基于另一个对象默认设置它,如下所示:

var mock = Mock.CreateByAlreadyPresent(GetMyClass());
mock.Setup(x=> x.Method666()).Throws(new Exception("BAD LUCK"));

有什么想法吗?我可以自己写反射方法,但是现在已经有这种方法了吗?

【问题讨论】:

  • 我花了一些时间对此进行调查,我认为目前这是不可能的。模拟使用动态代理来设置拦截器,如果你设置方法,它实际上会改变调用。目前无法连接到该机制并根据现有对象对其进行更改。
  • 嗯,但是您可以通过反射枚举方法并构造相应的 linq 模拟,不是吗?我觉得问题还没有实现,而不是不能实现(因为可以,后面我会加实现)
  • 确定你能做到。我更多地认为开箱即用的起订量不能提供解决方案。我怀疑moq4是否会支持这个,你可以直接在那里问。新的起订量应该支持这个 oob,但必须仔细研究一下。

标签: c# testing mocking moq


【解决方案1】:

您将为此使用属性 CallBase:

var mock = new Mock<MyClass> { CallBase = true };
mock.Setup(x => x.Method666()).Throws(new Exception("BAD LUCK"));

其他方法将有它们的默认行为。

【讨论】:

  • 我没有看到使用预定义的类:你应该使用 GetMyClass(),它本质上可以是 IoC 框架,它将返回接口 IMyClass 的 something。
猜你喜欢
  • 1970-01-01
  • 2015-05-25
  • 2011-10-27
  • 1970-01-01
  • 2021-08-24
  • 2014-02-27
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多