2011-06-03 22 views
13

次の両方のテストケースの実行後、COM実行がコンソールに出力されます。私は間違って何をしていますか?WPFによる終了時のCOM例外

テストを単独で実行する場合、または両方のテストを一緒に実行する場合、例外はコンソールに一度だけ書き込まれます。これは、私が掃除していないAppDomainリソースごとにいくつかの種類があることを疑うものです。

私はNUnitとMSTestで両方の環境で同じ動作をしてテストを試みました。 (実は、私は1つの例外プリントアウトまたは2でMSTestを結果の両方のテストを実行しているかはわからない。)

例外:

System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used. 
at System.Windows.Input.TextServicesContext.StopTransitoryExtension() 
at System.Windows.Input.TextServicesContext.Uninitialize(Boolean appDomainShutdown) 
at System.Windows.Input.TextServicesContext.TextServicesContextShutDownListener.OnShutDown(Object target) 
at MS.Internal.ShutDownListener.HandleShutDown(Object sender, EventArgs e) 

テストコード:

using NUnit.Framework; 

namespace TaskdockSidebarTests.Client 
{ 
    [TestFixture, RequiresSTA] 
    public class ElementHostRCWError 
    { 
     [Test] 
     public void WinForms() 
     { 
      var form = new System.Windows.Forms.Form(); 
      var elementHost = new System.Windows.Forms.Integration.ElementHost(); 
      form.Controls.Add(elementHost); 

      // If the form is not shown, the exception is not printed. 
      form.Show(); 

      // These lines are optional. The exception is printed with or without 
      form.Close(); 
      form.Controls.Remove(elementHost); 
      elementHost.Dispose(); 
      form.Dispose(); 
     } 

     [Test] 
     public void WPF() 
     { 
      var window = new Window(); 

      // If the window is not shown, the exception is not printed. 
      window.Show(); 

      window.Close(); 
     } 
    } 
} 
+0

たぶんhttp://social.msdn.microsoft.com/forums/en-US/vststest/thread/e53fdc45-23f3-4aee-aad9-f6​​3769f2c638/は役立ちます –

+0

悲しいことに、私はMTAを使用することはできません、 WPFにはSTAが必要です。 SetUpでフォームと要素のホストを作成しても、そのトリックは実行されません。アー。 –

+0

もし私が間違っていないなら、この例外はユニットテストに失敗することはありませんか?私はWPFコントロールのunittesting中に同じ例外が発生しました。私はそれを無視するように選択しました;) – Bubblewrap

答えて

18

私自身のコードをもう一度見れば、次の行がWPFテストの最後に表示されます。

Dispatcher.CurrentDispatcher.InvokeShutdown(); 
+0

Sweeeeet!それがそれでした。ありがとう!今私はこれを私のテスト・アーキテクチャーに適合させる方法を考え出すだけです。 –

+0

ディスパッチャがスレッド(つまり、Dispatcher.CurrentDispatcher)にバインドされると、他のディスパッチャをそのスレッドに関連付けることはできません。ディスパッチャがシャットダウンされると、ディスパッチャは再起動できません。だから私の問題を解決するが、私は悲しいことに、私の基本テストクラスのTearDownメソッドでInvokeShutdown()を呼び出すことはできません。 –

+0

各unittestで新しいSTAスレッドを開始し、その新しいスレッドでテストを実行し、そのスレッドがThread.Join()で終了するまで待ちます。 – Bubblewrap

1

あなたはおそらくすることができますWindowFormクラスをテストします。 WinFormsアプリケーションとWPFアプリケーションの両方に、基礎となる配管(メッセージポンプなど)を開始するために使用されるApplicationクラスがあります。私はその例外を避けるための鍵だと思う。

あなたはそこにいないし、できないかもしれません。私が今まで読んだユニットテストのための

すべての推奨はFormクラスとWindowクラスは(WPFにおけるM-V-VMのパターンのような)ユニットテストに必要な何もしないように、リファクタリングということです。 UIを表示できないことと関連があります。

UIをテストする他の方法があります。 This answerではユニットテストUIについて説明しています。

+3

実際、テストは正常に動作します。私はログファイルに多くの駄目を残してしまいます。 UIテストとストレート・ビジネス・ロジック・テストとの関係について - 私は、ユーザーが実際に処理していることが近くになるほど、夜間によく眠れると信じています。 –

+0

ジョエルとパトリックの両方の+1、私はあなたが両方とも正しいと思うので。私はJoelに同意しますが、そのようなデザインが必要です。古い/脆弱な/ notyoursコードが必要な場合にだけ、いくつかのコントロール/ウィンドウを自動化する必要があると主張することはできません。 – quetzalcoatl

関連する問題