我有一个c#类,它使用Mutex来控制对全局共享资源的访问。除非创建共享资源,否则不会分配互斥锁。我正在使用该类的部分模拟来隔离某些方法的测试,这些方法可以获取互斥锁,执行某些操作并释放它(无需实际创建共享资源或互斥锁实例)。
我很想知道是否有一种嘲笑互斥锁的首选方法。我可以将对WaitOne和ReleaseMutex的实际调用抽象为类中的方法并模拟它们。我可以在测试中明确地将一个新的互斥锁实例分配给类的mutex成员变量(假设我妥协并使得setter可以访问单元测试)。我可以将互斥锁包装在另一个实现互斥方法并行接口的类中,然后将其注入到我测试的类中。
是否有更好的方法来模拟System.Threading.Mutex等系统资源?到目前为止,我选择将真正的调用抽象为类中的方法并模拟它们。
答案 0 :(得分:0)
查看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
}
注意:垫片是我已经研究但尚未使用的东西 - 所以我的答案是基于文档而不是经验。他们的文档非常详尽。