カスタム例外 (ProcessException) が RunWorkerCompleted イベントでバックグラウンド ワーカーによってスローされることを確認する NUnit で単体テストを作成する際に問題が発生しています。議論のために、そのコードを変更できないと仮定しましょう。
私がやろうとしたことは、次のように単体テストで AppDomain の UnhandledExceptionHandler に接続することです。
AppDomain currentDomain = AppDomain.CurrentDomain;
UnhandledExceptionEventHandler handler = null;
handler = (s, e) =>
{
// Need to make it clear that an exception is expected in the output window
Console.WriteLine("==== Unhandled exception has been caught ====");
processExceptionWasThrownByBackgroundWorker = true;
currentDomain.UnhandledException -= handler;
Assert.AreEqual(typeof(ProcessException), e.GetType());
};
currentDomain.UnhandledException += handler;
CallMyBackgroundWorkerThatThrows();
Assert.AreEqual(true, processExceptionWasThrownByBackgroundWorker);
この単体テストは正常に実行され、TestDriven.Net を使用して Visual Studio 内から実行すると合格します。ただし、ビルド マシンで実行すると、NUnit コンソールも未処理の例外 [1] をキャッチし、NUnit プロセスの失敗を返しているように見えますが、テストはすべて成功したと報告されています。実際、カスタム例外 - ProcessException - をデシリアライズしようとして失敗しています。これは、ここで説明されていると思います [2]
[1] : http://www.mail-archive.com/nunit-core@lists.launchpad.net/msg00326.html
[2] : http://groups.google.com/forum/?fromgroups#!topic/nunit-discuss/7LF_X-yBWJ8
ビルド マシンからの出力:
[exec] Tests run: 147, Errors: 0, Failures: 0, Inconclusive: 0, Time: 27.6745774 seconds
[exec] Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0
[exec] Unhandled exceptions:
[exec] 1) Blah.ShelledProcessBackgroundRunnerTests.A_background_process_will_be_killed_if_the_timeout_is_exceeded : System.Runtime.Serialization.SerializationException: Unable to find assembly 'Blah, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
[exec] at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
[exec] at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
[exec] at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
[exec] at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
[exec] at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)
[exec] at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
[exec] at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
[exec] at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
[exec] at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.DeserializeObject(MemoryStream stm)
[exec] at System.AppDomain.Deserialize(Byte[] blob)
[exec] at System.AppDomain.UnmarshalObject(Byte[] blob)
[exec] c:\build_work\ourcibuild(229,26): External Program Failed: C:\Program Files (x86)\NUnit 2.5.10\bin\net-2.0\nunit-console-x86.exe (return code was -100)
これは、何が起こっている可能性が高いかを正確に反映していますか? 単体テスト内で処理している場合、処理されない例外を無視するように NUnit の動作を変更できますか?