Windows Phone 8单元测试创建位图

本文关键字:创建 位图 单元测试 Phone Windows | 更新日期: 2023-09-27 18:19:18

我有一个方法,它接受一个BitmapImage

我试图通过创建或加载BitmapImage来测试它,然后将其传递给所说的方法

然而,单元测试不允许我创建 bitmapimage,它抛出 InvalidCrossThreadException

是否有任何文档或资源详细说明如何在Windows Phone 8中使用BitmapImages的单元测试方法。

我们使用的是Visual Studio 2012 - update 2

Windows Phone 8单元测试创建位图

BitmapImage只能在UI线程上运行,而Unit-Test在后台线程上运行。这就是为什么会出现这个异常。对于任何涉及BitmapImage或其他UI组件的测试,您需要:

  1. 使用Dispatcher.BeginInvoke()
  2. 将UI工作推送到UI线程
  3. 等待UI线程结束后再完成测试。

例如,使用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;
    }
}