2

SpecflowとWatiNを使用していくつかの受け入れテストを行っていますが、IOCコンテナー(SimpleServiceLocator)の登録をどこに設定すればよいかわかりません。

私のウェブサイトでは、登録は私のglobal.asaxで行われます。

私のテストプロジェクトでは、[BeforeScenario]メソッドから次のようなコードを使用してそれらを設定しようとしました。

var container = new SimpleServiceLocator();
container.Register<ISitecoreLookupAccessor>(
    () => new SitecoreLookupAccessor());

Microsoft.Practices.ServiceLocation.ServiceLocator
    .SetLocatorProvider(() => container);

そして、アプリケーションプロジェクトでオブジェクトインスタンスを取得します。

ISitecoreLookupAccessor accessor =
    ServiceLocator.Current.GetInstance<ISitecoreLookupAccessor>();

しかし、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。ServiceLocator.Currentがnullであるため..。

4

1 に答える 1

0

Global.asax は ASP.NET 固有のものであり、テスト プロジェクトでは実行されません。これは、テスト ランナーが、global.asax である可能性を考慮する必要さえあることを知る方法がないためです :-)

つまり、 を使用できるようにするServiceLocator.Currentには、ServiceLocator.SetLocatorProviderそのテスト プロジェクトの有効なコンテナで を呼び出す必要があります。MSTest を使用する場合、メソッドを装飾するために使用できるAssemblyInitializeAttributeがあります。その場合、MSTest は、そのアセンブリ内のテスト メソッドを実行する前に、そのメソッドを実行します。他のテスト ランナーには、これを行うためのさまざまなメカニズムがあります。

ただし、テスト プロジェクトで Common Service Locator を構成する代わりに、テストで Common Service Locator を完全に使用しないようにすることをお勧めします。代わりに、テスト対象のクラスのすべての依存関係をそのコンストラクターに注入し、各テストのセットアップ フェーズでそれを行います (便宜上、テスト対象のそのようなオブジェクトの構築を特別なファクトリ メソッドにリファクタリングできます)。ServiceLocatorテスト中のクラス (またはアプリケーション内の任意のクラス) 内でfrom を呼び出さないようにします。この方法では、ServiceLocatorテストプロジェクトで。これにより、テスト アセンブリで DI 構成を維持する必要がないため、テストの記述が非常に簡単になります (また、複数のテスト プロジェクトを使用すると、複数の DI 構成が必要になります)。私はこの道を歩んできましたが、テストの DI 構成は非常に複雑になりました。特に、テストを並行して実行しているテスト ランナーに対処しなければならなかったためです。つまり、スレッドセーフなモックとスタブを挿入する必要がありました ( !)。しかし、テストが並行して実行されていなくても、テスト DI 構成を維持するのは非常に恐ろしいことです。

于 2012-01-13T12:19:44.443 に答える