c# - 模拟/ stub 系统资源(如 System.Threading.Mutex)的首选方法

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

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

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

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

最佳答案

查看 Microsoft Fakes Framework .它有一个叫做 shims 的东西它们的工作方式与 stub 或模拟略有不同,因为它们将调用转移给委托(delegate)。

框架将为您创建一个名为 ShimMutex 的类。在您的测试类中,您将编写委托(delegate)来重定向您使用的 Mutex 方法,然后在您的测试中按照以下行编写代码:

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

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

关于c# - 模拟/ stub 系统资源(如 System.Threading.Mutex)的首选方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23942227/

相关文章:

c# - 无效调用,已使用上次调用或未调用

C# UWP DataTemplate 内存泄漏

.net - 是否有适用于 VB6 的好的 TDD 工具或资源?

c# - 标签方向

asp.net-mvc-3 - 由于企业库,NUnit 测试失败

c++ - 如何正确调用 Assert::ExpectException?

c# - Rhino - 模拟类而不是覆盖虚拟方法

c# - 如何将两个对象连接到数组中?

c# - 链接 SelectMany 而不是使用 JOIN 语句