4

テストで次のことを行うコードで単体テストを実行しています。

Assert.IsNotNull(target.Icon);

Icon プロパティのゲッター内で、次のようにしています。

System.Windows.Controls.Image img = new System.Windows.Controls.Image();

それはこの例外をスローしています: System.InvalidOperationException : 多くの UI コンポーネントがこれを必要とするため、呼び出し元のスレッドは STA でなければなりません。

私はそれが何を意味するかを理解し、Dispatcher を使用する必要があることを理解していますが、方法または理由について少し混乱しています...これは ViewModel のプロパティであり、実行時にこれらの例外は発生しませんアプリケーション。

その他の情報: これは、.NET 4 にアップグレードしたときにのみ失敗し始めました。

4

4 に答える 4

1

ここでの問題は、適切に実行するために STA を必要とする WPF を単体テストしているが、単体テスト フレームワークが MTA を使用していることです。STA でテストを実行するには、単体テスト フレームワークをセットアップする必要があります。

各フレームワークには、異なる方法があります。通常、テスト フレームワーク名と STA を google に入力するだけで見つけることができます。

于 2010-06-09T06:36:12.130 に答える
1

単体テストを実行するスレッドは STA スレッドではないため、次のような STA スレッドを作成します。

Thread backgroundThread;
backgroundThread = new Thread(DoWork);
backgroundThread.SetApartmentState(ApartmentState.STA);
backgroundThread.Start();

使用している単体テスト フレームワークとそのスレッド モデルを変更する方法はわかりませんが、Thread.Start の前に Thread.SetApartmentState を呼び出す必要があります。

「アパートメント状態」は COM のものです。(エラーが言うように) 多くの WPF コントロールが COM を必要とするため、WPF によって必要とされます。STA スレッドには自動的に関連付けられたディスパッチャーがありません。

通常、ディスパッチャについて心配する必要はありません。必要に応じてシステムがディスパッチャを作成します。

スレッドのディスパッチャーを作成する必要がある場合は、読み取るだけでDispacher.CurrentDispacher済みますが、(Dispacher.Run を呼び出して) スレッドを制御させない限り、そのディスパッチャーで意味のあることを行うことはできません。

于 2010-06-09T06:25:50.917 に答える
0

少しアプローチを変える必要があると思います。Image コントロールではなく、イメージの URI を公開するように ViewModel を変更する必要があると思います。

単体テストでは、画像ソースが正しい場所に設定されることを検証できます。UI では、画像コントロールのソースを URI にデータバインドするだけで済みます。

于 2010-06-09T08:42:34.383 に答える
0

他の非 UI スレッドを使用していますか? もしそうなら、彼らがこのプロパティにアクセスしていないと確信していますか? このプロパティを使用する可能性がある、スレッドを使用するか、非同期で実行される (FileSystemWatcher など) フレームワークでコンポーネントを使用しているかどうかを確認します。ただし、さらにいくつかのコードが役立ちます。

于 2010-06-09T05:22:18.407 に答える