2

SpecflowとWatiNを使用していくつかの受け入れテストを行っていますが、IOCコンテナ(SimpleServiceLocator)の登録を設定する場所がわかりません。SpecflowとWatiNでのIOC(simpleServiceLocator)設定のテスト

私のウェブサイトでは、登録は私のglobal.asaxで行われています。私のテストプロジェクトで

、私は

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

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

ようなコードで、私の[BeforeScenario]方法からそれらを設定しようとしたと私は使用して自分のアプリケーションのプロジェクトにオブジェクトのインスタンスを取得

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

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

答えて

0

Global.asaxはASP.NET固有のもので、テストプロジェクトでは実行されません。テストランナーは、

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

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

+0

Steven、おかげさまでありがとうございました。私は、(簡単に)更新できないレガシーコードを扱っているImとしてコンストラクタインジェクションを使用できません。テスト・プロジェクトでAssemblyInititializeという属性のメソッドからSetLocatorProviderを呼び出すと、私がテストしているプロジェクトでServiceLocator.Currentがnullになっています。これはおそらく別のプロセスだからですが、コンストラクタ・インジェクションを使用できない場合はどうすればよいか分かりません。 –

+0

[AssemblyInitialize]で装飾されたメソッドが呼び出されることを確認します。それはうまくいくはずです、私は過去にそれをしました。そのようなメソッドのシグネチャが何であるべきか、そしてそれをどこに正確に置くべきか(たとえば、[TestClass]属性で装飾されたクラス内)を調べる必要があります。 – Steven

+0

あなたとあなたのプロジェクトにとって興味深い本は次のとおりです:[Working Effectively with Legacy Code](http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052)。 – Steven

関連する問題