Учитывая, что ваш код обычно запускается в главном потоке (gui) приложения Windows Form, и вы хотите, чтобы он вел себя по-другому во время работы в тесте, вы можете проверить на
if (SynchronizationContext.Current == null)
{
// code running in a background thread or from within a unit test
DoSomething();
}
else
{
// code running in the main thread or any other thread where
// a SynchronizationContext has been set with
// SynchronizationContext.SetSynchronizationContext(synchronizationContext);
DoSomethingAsync();
}
Я использую этодля кода, который я хочу fire and forgot
в графическом приложении, но в модульных тестах мне может понадобиться вычисленный результат для диссертации, и я не хочу связываться с несколькими выполняющимися потоками.
Работает для MSTest.Преимущество в том, что мой код не должен проверять саму среду тестирования, и если мне действительно нужно асинхронное поведение в определенном тесте, я могу установить свой собственный SynchronizationContext.
Имейте в виду, что это ненадежный методна Determine if code is running as part of a unit test
в соответствии с запросом OP, так как код может выполняться внутри потока, но для некоторых сценариев это может быть хорошим решением (также: если я уже запущен из фонового потока, возможно, нет необходимости запускать новый).