0

Ninjectのv1で問題が発生し、StandardKernelをリセットしています。カーネルへのアクセスを提供するために使用する静的オブジェクトがあります。

public static class ObjectFactory
{
    private static IKernel _kernel =  new StandardKernel(new CanceisModule());

    // Resolve methods snipped for brevity

    public static void Reset()
    {
        _kernel = null;
        _kernel = new StandardKernel(new CanceisModule());
    }
}

問題は、さまざまな単体テスト(MSTestを使用)またはフィットネスフィクスチャでObjectFactoryを使用しようとすると発生します。新しいテストやフィクスチャの前に常にObjectFactory.Reset()メソッドを呼び出しますが、Resetが実際には機能せず、元のバインディングがそのまま残っているように見える場合があります。Ninjectのv2でIKernelオブジェクトをリセットする方法があることは知っていますが、まだその動きをする準備ができていません(そしてそれは私たちにとってかなり重要な動きです)。

なぜこれが発生するのかについて誰かがアドバイスを提供できますか?異なるランナーの別々のスレッドでテストが実行される方法に関連していると思いますが、どうすれば回避できますか?

前もって感謝します

4

1 に答える 1

0

あなたのアプローチはうまくいくようです。

一般に、テストランナーは、マルチスレッドや推測のような魔法を実行しません。

Reset()にブレークポイントを設定し、テストをデバッグすることをお勧めします。

あなたのコードは静的クラスに非静的メソッドを持っているので、あなたが言及することを省略している他の何かがありますか?

「新しいテストまたはフィクスチャ」と言うとき、それはどれですか?多くの場合、テストでNinjectを使用している場合は、カーネルを基本クラスに保持し、混乱や疑いを避けるために、適切なタイミングでカーネルがリセットされるようにすることをお勧めします[オブジェクトファクトリの「シングルトン」に依存するよりも]。

于 2009-10-20T18:39:42.663 に答える