2

単体テスト中に作成されたすべてのオブジェクトを強制的にファイナライズする方法はありますか? 私が遭遇し続ける問題は、失われた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();
    }
}

これを実行すると、「合格」テストになりますが、バックグラウンド スレッドに未処理の例外があったという通知が表示されます。複数のテストを行うアセンブリでは、これは理想的とは言えません。

4

1 に答える 1

0

あなたは実際にDisposeメソッドをテストしたいと思っているようです。その場合は、Diposeメソッドを直接呼び出してみませんか?

GCは、それを呼び出すスレッドで実行されます。したがって、別の方法は、テスト内でGC.Collectionメソッドを呼び出すことです。

編集:ユニットテストでGC.Collectを呼び出してみましたか?私はあなたがやろうとしていることを正確に行う必要はありませんでしたが、私が理解していることから、ガラベッジコレクターはユニットテストのスレッド内で実行する必要があります。

于 2012-05-31T14:05:16.490 に答える