Windows Phone 8 Unit Test, создающий битовый образ

У меня есть метод, который принимает BitmapImage,

Я пытаюсь проверить это, создав или загрузив BitmapImage а затем передать его указанному методу.

Тем не менее, модульный тест не позволяет мне создать bitmapimage Кидает InvalidCrossThreadException,

Есть ли какая-либо документация или ресурс, в котором подробно описываются методы юнит-тестирования, которые принимают BitmapImages в Windows Phone 8,

Мы используем Visual Studio 2012 - обновление 2.

1 ответ

Решение

BitmapImage может выполняться только в потоке пользовательского интерфейса, а модульный тест выполняется из фонового потока. Вот почему вы получаете это исключение. Для любых испытаний с участием BitmapImage или другой компонент пользовательского интерфейса, вам нужно:

  1. Вставьте работу пользовательского интерфейса в поток пользовательского интерфейса, используя Dispatcher.BeginInvoke()
  2. Дождитесь завершения потока пользовательского интерфейса перед завершением теста.

Например, используя ManualResetEvent (семафор) для выполнения межпотоковой сигнализации и проверки того, что любые (перехватываемые) исключения передаются обратно в тестовый поток...

[TestMethod]
public void TestMethod1()
{
    ManualResetEvent mre = new ManualResetEvent(false);
    Exception uiThreadException = null;

    Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            try
            {
                BitmapImage bi = new BitmapImage();

                // do more stuff
                // simulate an exception in the UI thread
                // throw new InvalidOperationException("Ha!");
            }
            catch (Exception e)
            {
                uiThreadException = e;
            }

            // signal as complete
            mre.Set();                    
        });

    // wait at most 1 second for the operation on the UI thread to complete
    bool completed =  mre.WaitOne(1000);
    if (!completed)
    {
        throw new Exception("UI thread didn't complete in time");
    }

    // rethrow exception from UI thread
    if (uiThreadException != null)
    {
        throw uiThreadException;
    }
}
Другие вопросы по тегам