単体テスト中に作成されたすべてのオブジェクトを強制的にファイナライズする方法はありますか? 私が遭遇し続ける問題は、失われたGCHandle
インスタンスによるリークは、プロセス自体 ( AppDomain
! ではなく) が終了したときにのみ確定されるように見えることです。これは、アセンブリ内のすべてのテストが実行された (そして潜在的に「合格」した) 後です。
私の最善の、しかし不十分な C# での試み:
class Foo : IDisposable
{
~Foo() { Dispose(); }
public void Dispose() { throw new Exception(); }
}
[TestClass]
public class Finalise
{
void bar()
{
GCHandle.Alloc(new Foo()); // leak
}
[TestMethod]
public void DetectFinalizeException()
{
bar();
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
これを実行すると、「合格」テストになりますが、バックグラウンド スレッドに未処理の例外があったという通知が表示されます。複数のテストを行うアセンブリでは、これは理想的とは言えません。