【问题标题】:Preferred way to mock/stub a system resource like System.Threading.Mutex模拟/存根系统资源(如 System.Threading.Mutex)的首选方式
【发布时间】:2014-05-29 20:19:57
【问题描述】:

我有一个使用 Mutex 来控制对全局共享资源的访问的 c# 类。除非创建共享资源,否则不会分配互斥锁。我正在使用该类的部分模拟来隔离对某些获取互斥锁的方法的测试,做一些工作,然后释放它(实际上没有创建共享资源或互斥锁实例)。

我很想知道是否有一种首选的方式来模拟互斥锁。我可以将对 WaitOne 和 ReleaseMutex 的真正调用抽象为类上的方法并模拟它们。我可以在测试中为类的 mutex 成员变量显式分配一个新的 mutex 实例(假设我妥协并使单元测试可以访问 setter)。我可以将互斥锁包装在另一个实现互斥锁方法并行接口的类中,并将其注入到我的测试类中。

有没有更好的方法来模拟 System.Threading.Mutex 等系统资源?到目前为止,我选择将真正的调用抽象为类上的方法并模拟它们。

【问题讨论】:

  • 一般来说,如果你想模拟一些你无法直接控制的东西(并且还不能通过提供自己的接口来模拟),你最好的选择是添加另一个抽象层并模拟那个。

标签: c# unit-testing rhino-mocks-3.5


【解决方案1】:

查看Microsoft Fakes Framework。它有一个名为 shims 的东西,它与存根或模拟的工作方式略有不同,因为它们将调用转移到委托。

框架将为您创建一个名为 ShimMutex 的类。在您的测试类中,您将编写委托来重定向您使用的 Mutex 方法,然后在您的测试中编写代码,如下所示:

using (ShimsContext.Create())
{
    System.Fakes.ShimMutex.AllInstances.WaitOne = () => { some code };
    System.Fakes.ShimMutex.AllInstances.ReleaseMutex = () => { some code };
    //The rest of your test
}

注意:垫片是我研究过但尚未使用的东西 - 所以我的回答是基于文档而不是经验。不过,他们的文档非常详尽。

【讨论】:

  • 我认为使用垫片的理念是尽可能少地使用它们。
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 2022-07-16
  • 2016-12-31
相关资源
最近更新 更多