Estoy intentando seguir las sugerencias del Using the WPF Dispatcher in unit tests para ejecutar mi prueba nUnit.Método correcto para usar el Despachador de WPF en las pruebas unitarias
Cuando escribo mi unidad de prueba de la siguiente manera, funciona:
[Test]
public void Data_Should_Contain_Items()
{
DispatcherFrame frame = new DispatcherFrame();
PropertyChangedEventHandler waitForModelHandler = delegate(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Data")
{
frame.Continue = false;
}
};
_myViewModel.PropertyChanged += waitForModelHandler;
Dispatcher.PushFrame(frame);
Assert.IsTrue(_myViewModel.Data.Count > 0, "Data item counts do not match");
}
Sin embargo, si trato de utilizar la sugerencia de la DispatcherUtil, no funciona:
[Test]
public void Data_Should_Contain_Items()
{
DispatcherUtil.DoEvents();
Assert.IsTrue(_myViewModel.Data.Count > 0, "Data item counts do not match");
}
public static class DispatcherUtil
{
[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static void DoEvents()
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(ExitFrame), frame);
Dispatcher.PushFrame(frame);
}
private static object ExitFrame(object frame)
{
((DispatcherFrame)frame).Continue = false;
return null;
}
}
Cuando Estoy usando DispatcherUtil, parece que la llamada a ExitFrame sucede demasiado pronto, antes de que los datos estén listos.
¿No utilizo DispatcherUtil correctamente? Parece que es un mejor método para manejar el despachador en lugar de esperar las devoluciones de llamada del modelo de vista.
¿Qué está tratando de probar, solo si el PropertyChangedEventHandler se invoca a la propiedad "datos"? Si es así, ¿por qué necesita involucrar al despachador? Tampoco uso _myViewModel aparte para adjuntar el controlador. – Phil
@Phil: Cuando se crea una instancia de _myViewModel, su constructor realiza una llamada asyn. Cuando se complete esa llamada, _myViewModel.Data debería tener algunos valores. Estoy intentando comprobar que los datos están, de hecho, poblados, pero el hecho de que los datos se completen como resultado de una llamada asyn es lo que me está causando algunos problemas. Me gustaría evitar tener que escuchar eventos PropertyChanged en cualquier prueba de unidad que pueda tener que tratar con el Dispatcher. – Flack