26

単体テストから呼び出そうとするメソッドがあります。このメソッドは、実際にはバックグラウンド スレッドから実行されます。いくつかのコードを使用して、UI スレッドへの呼び出しの更新を開始します ( Application.Current.Dispatcher.BeginInvoke.... を使用)。

ただし、単体テストから呼び出された場合ですApplication.Currentnull

if (Application.Current !=null)私は、すべてを修正するために何を配置するかは本当にわかりません。

これを回避する他の方法はありますか?

_statusUpdates は ObservableCollection です

以下は、私がテストしようとしているメソッドのコードの一部です(公平を期すために、単体テストというよりも統合テストです)。

Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (EventHandler)delegate
{
    _statusUpdates.Add(new StatusUpdate
    {
        DateTime = DateTime.Now,
        Message = "Checking For Messages"
    });
}, null, null);
4

5 に答える 5

27

次のコードスニペットは私にとってはうまくいきます:

if (System.Windows.Application.Current == null) 
  { new System.Windows.Application { ShutdownMode = ShutdownMode.OnExplicitShutdown }; }

IIRC、WinFormsアプリケーションに埋め込まれたWPFコントロールを使用してApplicationがnullであるという問題があり、そのコードスニペットがStackOverflowに関する別の質問で問題の解決策として提案されました(申し訳ありませんが、ソースが見つかりません)。単体テストで同じ問題を解決します (その場合、ShutdownMode プロパティを明示的に設定する必要はないと思います)。

于 2016-10-03T22:07:52.183 に答える
0

単体テスト ランナーには Application オブジェクトはありません。これらは通常、非 UI コード (「ユニット」) を単純に実行および実行する「コンソール」ベースのアプリケーションです。

UI 固有の情報をテストするために単体テスト フレームワークを使用しないことをお勧めします。そのためには、自動化された UI テスト フレームワークを使用することをお勧めします。

于 2013-02-12T17:17:01.923 に答える
-1

したがって、ここでの問題は、どこかに Application オブジェクトを作成する必要があることです。System.Windows.Applicationしたがって、 (またはいくつかの子孫) クラスがインスタンス化されている場所を見つける必要があります。

プロジェクトがテンプレートから構築された場合、このクラスはおそらく App.xaml ファイルにあります。これが何らかの方法でインスタンス化されることを確認する必要があるだけです。それ以外の場合は、プロジェクト全体でApplicationクラスを検索してから、手動でインスタンス化する必要があります。それを修正する必要があります。

于 2013-02-12T17:12:52.203 に答える