Наш бизнес недавно перешел на стиль TDD, и я новичок в написании юнит-тестов.Часть C # (.net 3.5), которую я сейчас пишу, должна быть в состоянии проверить, работает ли отдельный процесс, так как я понимаю, что это лучший способ с использованием класса Mutex.
Так что у меня есть метод в моем SrsUpdaterControllerкласс вроде так ...
public bool IsUpdaterRunning()
{
Mutex srsUpdaterMutex = new Mutex(false, SRS_UPDATERGUID);
if (srsUpdaterMutex.WaitOne(0)) //If SRS Updater is running
{
srsUpdaterMutex.ReleaseMutex();
srsUpdaterMutex.Close();
return false;
}
else
{
return true;
}
}
и у меня есть тест
[TestMethod()]
public void IsUpdaterRunningTrueTest()
{
SrsUpdaterController target = new SrsUpdaterController();
string mutexGuid = SrsUpdaterController.SRS_UPDATERGUID;
bool expected = true;
bool actual;
Mutex srsUpdaterMutex = new Mutex(false, mutexGuid);
srsUpdaterMutex.WaitOne(3000);
actual = target.IsUpdaterRunning();
srsUpdaterMutex.ReleaseMutex();
srsUpdaterMutex.Close();
Assert.AreEqual(expected, actual);
}
Он не работает, потому что модульный тест и метод IsUpdaterRunning вызываются одним и тем же потоком, ипоэтому Windows достаточно «умна» , чтобы процесс не блокировал сам себя.Проблема в том, что я ХОЧУ, чтобы процесс блокировал себя, чтобы он имитировал требуемый мьютекс.Есть какой-либо способ сделать это?Или я не совсем согласен с модульным тестированием / синхронизацией процессов / управлением мьютексами?
(обратите внимание, я также пытался заблокировать Mutex в отдельном потоке, запущенном из теста, но он все же позволял мне запрашивать мьютекс воба места. Это нормально, потому что я бы предпочел избегать тем, когда это возможно)
Заранее спасибо!