C#(.NET 4.0)で記述された複雑なWPFプロジェクトがあり、(NUnit)用にいくつかのテストを記述しました。これらのテストはさまざまなクラスにあり、各クラスのテストを個別に実行する限り、すべて問題ありません。ただし、すべてのクラスのすべてのテストを一度に実行しようとすると、最初のクラスのテストは成功しますが、テストランナー(Resharperまたはnunit-console)が残りのクラスのテストを開始すると、次のスタックトレースですべてが失敗します。
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.Media.Imaging.BitmapDecoder.ToString()
at System.Windows.Media.Imaging.BitmapFrameDecode.ConvertToString(String format, IFormatProvider provider)
at System.Windows.Media.ImageSource.ToString()
at MUSTANG.ShowCase.ResourceLibrary.ResourceDictionaryManager.GetUriString(String pKey) in c:\Daten\Jenkins-ci\jobs\MUSTANG-Showcase-Release-VS2010\workspace\MUSTANG-Showcase\MUSTANG.ShowCase.ResourceLibrary\ResourceDictionaryManager.cs:Zeile 49.
対応するコードは次のとおりです。
public object GetValue(string pKey)
{
if (mDictionary.Contains(pKey))
{
return mDictionary[pKey];
}
return null;
}
public String GetUriString(string pKey)
{
object result = GetValue(pKey);
if (null == result)
{
Log.Warn(string.Format(@"Ressource '{0}' nicht gefunden!", pKey));
return "";
}
return result.ToString();
}
リソースが画像の場合、GetUriStringの最後の行で例外が発生します。Nunitは、さまざまなスレッドを使用してさまざまなテストクラスを実行しているようですが、それでも順番に実行されます。この問題を解決する方法はありますか?たとえば、NUnitまたはテストランナーに単一のスレッドを使用するように指示したり、各テストクラスの実行後に完全に終了したりするなどの方法はありますか?
編集1:私がこれまでに試したこと:
[RequiresSTA]
属性でテストを飾る- 各テストクラスを実行する前に、ResourceDictionaryManagerクラスをリセットします(このエラーが発生する場所です)。これにより、ResourceDictionaryManagerクラスの問題は解決しましたが、コードの「後で」まったく同じ問題が発生します。
- すべてのテストを同じ巨大なクラスにコピーします。すべてのテストは正常に実行されます(ただし、それは私が望むものではありません)
問題は、NUnitがテストメソッドを含むクラスごとに異なるスレッドを使用していることであるように思われるので、次の方法を見つける必要があります。
- 同じスレッドですべてのテストクラスを実行するようにNUnitに指示します
また
- TestFixtureTearDownメソッドのNUnitに、アプリケーションを完全にシャットダウンするように指示します。これにより、次のテストクラスで新しいアプリケーションをインスタンス化できます。
new Application();