Si no desea probar el hecho de que el hilo realmente duerme, un enfoque más directo (y uno que es posible) es tener un ISleepService. Puede simular esto y luego no dormir en sus pruebas, pero tiene una implementación que causa un Thread.Sleep en su código de producción.
ISleepService sleepService = Container.Resolve<ISleepService>();
..
while (running)
{
...
// Work
...
sleepService.Sleep(Interval);
}
Ejemplo usando Moq:
public interface ISleepService
{
void Sleep(int interval);
}
[Test]
public void Test()
{
const int Interval = 1000;
Mock<ISleepService> sleepService = new Mock<ISleepService>();
sleepService.Setup(s => s.Sleep(It.IsAny<int>()));
_container.RegisterInstance(sleepService.Object);
SomeClass someClass = _container.Resolve<SomeClass>();
someClass.DoSomething(interval: Interval);
//Do some asserting.
//Optionally assert that sleep service was called
sleepService.Verify(s => s.Sleep(Interval));
}
private class SomeClass
{
private readonly ISleepService _sleepService;
public SomeClass(IUnityContainer container)
{
_sleepService = container.Resolve<ISleepService>();
}
public void DoSomething(int interval)
{
while (true)
{
_sleepService.Sleep(interval);
break;
}
}
}
actualización
En una nota de diseño \ mantenimiento, si es doloroso para cambiar el constructor de "SomeClass", o para agregar la inyección de dependencias señala al usuario de la clase, a continuación, un patrón de tipo de localizador de servicio puede ayudar aquí, por ejemplo:
private class SomeClass
{
private readonly ISleepService _sleepService;
public SomeClass()
{
_sleepService = ServiceLocator.Container.Resolve<ISleepService>();
}
public void DoSomething(int interval)
{
while (true)
{
_sleepService.Sleep(interval);
break;
}
}
}
corto de cambiar realmente el valor del reloj (que estoy seguro de que no quiere hacer), no lo hará ser capaz de obtener los resultados que está buscando. –
La solución preferida es aislar la funcionalidad de sincronización con un servicio para que pueda simular el servicio para sus pruebas. Si no puede hacer esto (a menudo porque es una base de código existente), entonces una alternativa es usar un marco como Moles para desviar las llamadas estáticas: http://research.microsoft.com/en-us/projects/moles/ –