Una de las cosas más importantes que quería probar eran unos ItemEventReceivers de una lista. Esto funciona sin problemas cuando pruebas los eventos síncronos como el ItemAdding o el ItemUpdating pero cuando se trata de probar los eventos asíncronos es necesario esperar...
Si pones el hilo del test a dormir los eventos asíncronos no se ejecutarán ya que es el mismo en el que se ejecuta el código de SharePoint y aunque tu código funcione cuando lo ejecutas a mano los tests fallarán.
Es por esto que he creado una clase basada en timers que no cuelga el hilo dejando ejecutarse los eventos asíncronos.
- public class Waiter : IDisposable
- {
- public enum WaiterState
- {
- Waiting,
- TimedOut,
- Success,
- Error
- };
- System.Timers.Timer WaitTimer;
- ManualResetEvent manualResetEvent;
- int WaitCounter;
- private Waiter(int interval)
- {
- WaitCounter = 0;
- manualResetEvent = new ManualResetEvent(true);
- WaitTimer = new System.Timers.Timer() { AutoReset = false, Interval = interval };
- WaitTimer.Elapsed += new ElapsedEventHandler(WaitTimer_Elapsed);
- }
- void WaitTimer_Elapsed(object sender, ElapsedEventArgs e)
- {
- WaitCounter++;
- manualResetEvent.Set();
- }
- /// <summary>
- /// Waits for the interval in milliseconds times number of times or once by default.
- /// </summary>
- public static WaiterState Wait(int interval, int times)
- {
- try
- {
- using (Waiter WaiterClass = new Waiter(interval))
- {
- while (WaiterClass.WaitCounter <= times)
- {
- WaiterClass.WaitTimer.Start();
- WaiterClass.manualResetEvent.WaitOne();
- }
- }
- }
- catch
- {
- return WaiterState.Error;
- }
- return WaiterState.Success;
- }
- /// <summary>
- /// Waits for the interval in milliseconds once.
- /// </summary>
- public static WaiterState Wait(int interval)
- {
- return Wait(interval, 0);
- }
- void Dispose()
- {
- WaitTimer.Dispose();
- }
- }
No hay comentarios:
Publicar un comentario