2014-04-22 157 views
2

场景:我有一个类在其默认构造函数中订阅静态事件。因此,该课程制作为IDisposable,以便它可以取消订阅静态事件并且适当地进行垃圾收集。这门课在使用RhinoMocks进行测试时被模拟。它有复合部分的孩子,可能或可能不是IDisposable嘲笑IDisposable类

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

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

+0

这不是'IDisposable'的用途。你总是需要手动调用Dispose,所以你不能依赖它被调用。静态事件是一种可怕的模式,你应该避免它们像瘟疫一样。我知道这并不能真正回答你的问题,但是你应该修改你的应用程序设计 - 如果你依赖于静态事件,你很可能会做一些非常错误的事情。至少,您应该使用您自己的活动管理器,例如只使用弱引用(如果这是您的使用模式) - 如果您发现该对象已在此期间收集,请将其从经理中移除。 – Luaan

+0

我全心全意地认同你@Luaan,订阅静态事件会导致各种问题,应该避免。令人遗憾的是,在我加入之前的几年中,这已经在客户的框架中实现了,并且已经成为管理应用程序事件的重要组成部分。重构不是一种恐惧的选择,因为没有人会为此付费。我已经研究过弱事件订阅,但还没有发现任何感觉可靠或完整的东西。你知道一个很好的来源,我都耳朵:) – Xilconic

回答

0

当嘲笑可以在附加的接口(或类型)通过一个类来实现(例如IDisposable接口)

在撕裂单元测试的向下阶段可以嘲笑对象投射到一个类型IDisposable接口的和调用Dispose

+0

对不起,但我不遵循?你能详细说明一下吗?也许有一个(伪代码)的例子? – Xilconic