【发布时间】: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,但必须仔细研究一下。