3

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

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

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

4

1 回答 1

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
}

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

于 2014-05-30T10:13:02.153 回答