コードベースには、GUIスレッドで実行されることを確認するためにApplication.Current.Dispatcher.Invoke...に依存するメソッドがいくつかあります。現在、これらのメソッドの単体テストを作成しようとしていますが、(予想どおり)Application.Currentがnullであるため、NullReferenceExceptionが発生します。
http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/786d5c06-0511-41c0-a6a2-5c4e44f8ffb6/で提案されているように、影響を受けるテストを独自のAppDomainで実行しようとしました。
しかし、それを行ってもApplication.Currentはnullのままです。AppDomainを起動して、Application.Currentを設定するべきではありませんか?なぜまだnullなのですか?
私のコード:基本クラス:
[TestClass()]
[Serializable]
public class UnitTest
{
protected void ExecuteInSeparateAppDomain(string methodName)
{
AppDomainSetup appDomainSetup = new AppDomainSetup();
appDomainSetup.ApplicationBase = Environment.CurrentDirectory;
AppDomain appDomain = AppDomain.CreateDomain(methodName, null, appDomainSetup);
try
{
appDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs e)
{
throw e.ExceptionObject as Exception;
};
UnitTest unitTest = appDomain.CreateInstanceAndUnwrap(GetType().Assembly.GetName().Name, GetType().FullName) as UnitTest;
MethodInfo methodInfo = unitTest.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
if (methodInfo == null)
{
throw new InvalidOperationException(string.Format("Method '{0}' not found on type '{1}'.", methodName, unitTest.GetType().FullName));
}
try
{
methodInfo.Invoke(unitTest, null);
}
catch (System.Reflection.TargetInvocationException e)
{
throw e.InnerException;
}
}
finally
{
AppDomain.Unload(appDomain);
}
}
}
呼び出し元の単体テスト(UnitTestから継承するクラスに含まれています):
[TestMethod()]
public void QualifierViewModel_FlagsAndLoadDatasets()
{
ExecuteInSeparateAppDomain("TestLoadDataSets");
}