【问题标题】:Mocking IDisposable classes模拟 IDisposable 类
【发布时间】:2014-04-22 09:34:37
【问题描述】:

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

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

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

【问题讨论】:

  • 这不是IDisposable 的用途。你总是必须手动调用Dispose,所以你不能依赖它被调用。静态事件是一种可怕的模式,你应该像避免瘟疫一样避免它们。我知道这并不能真正回答您的问题,但您应该修改您的应用程序设计 - 如果您依赖静态事件,您可能会做一些非常错误的事情。至少,您应该使用自己的事件管理器,例如仅使用弱引用(如果这是您的使用模式) - 如果您发现对象已在此期间被收集,只需将其从管理器中删除。
  • 我完全同意@Luaan 的观点,订阅静态事件会导致各种问题,应该避免。可悲的是,这在我加入之前几年前已经在客户的框架中实现了,并且已经成为管理应用程序事件的组成部分......我担心重构不是一种选择,因为没有人会为此付费。我研究了弱事件订阅,但没有发现任何感觉可靠或完整的东西。你知道一个很好的消息来源,我全神贯注:)

标签: c# memory-leaks rhino-mocks idisposable


【解决方案1】:

当你模拟一个类时,你可以传入额外的接口(或类型)来实现(例如 IDisposable)

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

【讨论】:

  • 对不起,我没跟上?你能详细说明一下吗?也许有一个(伪代码)示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2019-08-18
  • 1970-01-01
  • 2014-04-06
相关资源
最近更新 更多