【发布时间】:2019-07-03 19:28:33
【问题描述】:
我有 Common 和 UnitTestSemaphoreLocker 类的程序集:
public static class UnitTestSemaphoreLocker
{
private static readonly SemaphoreSlim Semaphore = new SemaphoreSlim(1, 1);
public static void Lock([NotNull] Action work)
{
if (work == null) throw new ArgumentNullException(nameof(work));
Semaphore.Wait();
try
{
work();
}
finally
{
Semaphore.Release();
}
}
public static async Task LockAsync([NotNull] Func<Task> worker)
{
if(worker == null) throw new ArgumentNullException(nameof(worker));
await Semaphore.WaitAsync();
try
{
await worker();
}
finally
{
Semaphore.Release();
}
}
}
我有两个单元测试程序集,比如说TestAssemblyA 和TestAssemblyB
来自两个程序集的单元测试使用一种资源,每次仅支持一次调用。
所以我希望你使用我的UnitTestSemaphoreLocker 来锁定单元测试并让它们一个一个地执行:
[TestMethod]
public void ConstructionTest()
{
UnitTestSemaphoreLocker.Lock(() =>
{
//test body
});
}
它非常适合在一个程序集中进行测试,但似乎其中两个创建了我的常见静态 UnitTestSemaphoreLocker 类的自己的实例。
有没有办法从两个程序集中同步单元测试?同时部分必须使用async/await。
【问题讨论】:
-
你的单元测试应该被隔离。这对我来说是一种代码味道。如果您必须在单元测试中这样做,那么您的代码是错误的,应该重构。
-
@Liam 是的,我完全同意你的看法。但它的遗留项目,遗憾的是这不能改变。我们有一些外部资源,供两个测试程序集使用。我希望我们可以模拟它,但在现实生活中,我们不能再投入几周时间来重构 2000 多个单元测试中的复杂代码。
标签: c# unit-testing async-await synchronization mstest