1

を取るメソッドBitmapImageがあります。

BitmapImageを作成またはロードしてから、それを上記のメソッドに渡すことでテストしようとしています。

ただし、単体テストでは を作成できず、bitmapimageがスローされInvalidCrossThreadExceptionます。

を取り込むメソッドを単体テストする方法を詳しく説明するドキュメントまたはリソースはありますか。BitmapImagesWindows Phone 8

Visual Studio 2012 - update 2を使用しています。

4

1 に答える 1

2

BitmapImageUI スレッドでのみ実行でき、単体テストはバックグラウンド スレッドから実行されます。これが、この例外が発生する理由です。またはその他の UI コンポーネントを含むテストではBitmapImage、次のことを行う必要があります。

  1. を使用して UI 作業を UI スレッドにプッシュします。Dispatcher.BeginInvoke()
  2. テストを完了する前に、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;
    }
}
于 2013-06-21T14:49:20.697 に答える