C# 模拟IDisposable类

C# 模拟IDisposable类,c#,memory-leaks,rhino-mocks,idisposable,C#,Memory Leaks,Rhino Mocks,Idisposable,场景:我有一个类在其默认构造函数中订阅静态事件。因此,该类被设置为IDisposable,这样它就可以从静态事件中取消订阅并正确地进行垃圾收集。正在使用rhinomock在测试中模拟此类。它具有复合零件子项,这些子项可能是可识别的,也可能不是可识别的 问题:由于Dispose方法被RhinoMocks自动模拟,我正在泄漏这些对象。这会导致不同测试中出现“随机”错误,因为仍然订阅的对象对未正确设置的事件作出反应 问:我知道RhinoMocks有一些方法可以声明应该调用原始方法(CallOrigin

场景:我有一个类在其默认构造函数中订阅静态事件。因此,该类被设置为IDisposable,这样它就可以从静态事件中取消订阅并正确地进行垃圾收集。正在使用
rhinomock
在测试中模拟此类。它具有复合零件子项,这些子项可能是可识别的,也可能不是可识别的

问题:由于Dispose方法被
RhinoMocks
自动模拟,我正在泄漏这些对象。这会导致不同测试中出现“随机”错误,因为仍然订阅的对象对未正确设置的事件作出反应


问:我知道RhinoMocks有一些方法可以声明应该调用原始方法(
CallOriginalMethod
),但我注意到,
RhinoMocks
有时会在我自己的声明之外创建代理本身。因此,我认为我无法阻止这些对象被泄漏。有没有办法解决这个问题?

当您模拟一个类时,您可以传递其他接口(或类型)来实现(例如IDisposable)


在单元测试的拆卸阶段,您可以将模拟对象强制转换为IDisposable类型,并调用Dispose

,这不是
IDisposable
的用途。您始终必须手动调用
Dispose
,因此您不能依赖于它被调用。静态事件是一种可怕的模式,你应该像躲避瘟疫一样避免它们。我知道这并不能真正回答你的问题,但你应该修改你的应用程序设计——如果你依赖静态事件,你很可能做了一些非常错误的事情。至少,您应该使用您自己的事件管理器,例如,只使用弱引用(如果这是您的使用模式)-如果您发现在此期间收集了对象,只需将其从管理器中删除即可。我完全同意您@Luaan,订阅静态事件会导致各种问题,应该避免。遗憾的是,在我加入之前,这已经在多年前的客户机框架中实现,并且已经成为管理应用程序事件不可或缺的一部分。。。重构恐怕不是一种选择,因为没有人会为此付费。我调查了弱事件订阅,但没有发现任何可靠或完整的内容。你知道一个好消息来源,我洗耳恭听:)对不起,我不明白?你能详细说明一下吗?也许是一个(伪代码)示例?