Модульное тестирование блокировки мьютекса - PullRequest
2 голосов
/ 31 января 2012

Наш бизнес недавно перешел на стиль 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 в отдельном потоке, запущенном из теста, но он все же позволял мне запрашивать мьютекс воба места. Это нормально, потому что я бы предпочел избегать тем, когда это возможно)

Заранее спасибо!

...