現在、MbUnit テスト スイートを介して実行される一連の統合テストがあります。IOC フレームワーク (StructureMap) を使用するために、多くのコードをリファクタリング中です。
MBUnit テスト ランナーが起動したときに、本番環境で使用しているのと同じレジストリ コードを使用して、コンテナーを一度だけ構成/初期化したいと考えています。
MbUnit でこれを達成する方法はありますか?
(編集) MbUnit のバージョンは 2.4.197 です。
現在、MbUnit テスト スイートを介して実行される一連の統合テストがあります。IOC フレームワーク (StructureMap) を使用するために、多くのコードをリファクタリング中です。
MBUnit テスト ランナーが起動したときに、本番環境で使用しているのと同じレジストリ コードを使用して、コンテナーを一度だけ構成/初期化したいと考えています。
MbUnit でこれを達成する方法はありますか?
(編集) MbUnit のバージョンは 2.4.197 です。
それを見つけた。AssemblyCleanup属性。
テスト実行全体で 1 つのコンテナーのみをスピンアップし、それをテスト スイートの実行全体で使用するコンテナーにしたいということを理解しています。MBUnitのドキュメントでは、TestSuiteFixture と TestSuiteFixtureSetup を使用して目的を達成できるように見えます。
StructureMap ユーザーとテスト駆動型開発者の観点からお話ししたいと思います。
コンテナーから何かを取り出すことを明示的にテストしない限り、テスト スイートでコンテナーを使用することはほとんどありません。これが必要な場合は、以下の抽象テスト基本クラスを使用します (NUnit を使用することに注意してください)。
[TestFixture] public abstract class with_container { 保護された IContainer Container;
[TestFixtureSetUp]
public void beforeAll()
{
Container = new ServiceBootstraper().GetContainer();
Container.AssertConfigurationIsValid();
}
} public class Bootstraper { public Bootstraper() { ObjectFactory.Initialize(x => { //ここに登録します }); }
public IContainer GetContainer()
{
return ObjectFactory.Container;
}}
通常のテストでは、通常のコンテナーをスキップして、StructureMap に含まれる automocking コンテナーのみを使用することをお勧めします。これは、私たちが使用する別の便利な抽象テスト基本クラスです。
public abstract class Context<T> where T : class
{
[SetUp]
public void Setup()
{
_services = new RhinoAutoMocker<T>(MockMode.AAA);
OverrideMocks();
_cut = _services.ClassUnderTest;
Given();
}
public RhinoAutoMocker<T> _services { get; private set; }
public T _cut { get; private set; }
public SERVICE MockFor<SERVICE>() where SERVICE : class
{
return _services.Get<SERVICE>();
}
public SERVICE Override<SERVICE>(SERVICE with) where SERVICE : class
{
_services.Inject(with);
return with;
}
public virtual void Given()
{
}
public virtual void OverrideMocks()
{
}
}
このコンテキストテスターを使用した基本的なテストは次のとおりです。
[TestFixture]
public class communication_publisher : Context<CommunicationPublisher>
{
[Test]
public void should_send_published_message_to_endpoint_retrieved_from_the_factory()
{
var message = ObjectMother.ValidOutgoingCommunicationMessage();
_cut.Publish(message);
MockFor<IEndpoint>().AssertWasCalled(a => a.Send(message));
}
}
これがまさにあなたが望んでいたものではない場合は申し訳ありません. これらのテクニックだけが私たちにとって非常にうまく機能しているので、共有したいと思いました.