6

私は AutoFixture を初めて使用するので、次のアイデアが理にかなっているのか、それとも合理的なことなのかわかりません。統合テストを担当しているアプリケーションがあり、Castle Windsor を多用しています。依存関係の管理を簡素化し、テストをアプリケーション コードに近づけるために、テストの初期化メソッドで Windsor コンテナーを構築し、container.Resolve を使用してテスト中のコードをインスタンス化しています。特定の状況での柔軟性が制限されているため、そのアプローチから離れたいと思います。

私がやりたいのは、次のようなテストを行うことです。

[Theory]
[Dependency]
public void TestWithDependencies(IThing thing)
{
    thing.Hello();
}

これを実現するために、次のことができます。

public sealed class DependencyAttribute : AutoDataAttribute
{
    public DependencyAttribute()
        : base(new Fixture().Customize(new WindsorCustomization()))
    {
    }
}

public class WindsorCustomization : ICustomization
{
    public WindsorCustomization()
    {
        // build container here using SUT installers
    }

    public void Customize(IFixture fixture)
    {
        fixture.Inject<IThing>(new Thing());
    }
}

これを行うとうまくいきますが、回避したいのは、Windsor コンテナーから AutoFixture IFixture への実装マッピングへのすべてのインターフェイスをコピーする必要があることです。

4

1 に答える 1

6

次のようなことができるはずです。

public class WindsorCustomization : ICustomization
{
    private readonly IWindsorContainer container;

    public WindsorCustomization()
    {
        // build this.container here using SUT installers
    }

    public void Customize(IFixture fixture)
    {
        fixture.Customizations.Add(new WindsorAdapter(this.container));
    }
}

public WindsorAdapter : ISpecimenBuilder
{
    private readonly IWindsorContainer container;

    public WindsorAdapter(IWindsorContainer container)
    {
        this.container = container;
    }

    public object Create(object request, ISpecimenContext context)
    {
        var t = request as Type;
        if (t == null || !this.container.Kernel.HasComponent(t))
            return new NoSpecimen(request);

        return this.container.Resolve(t);                
    }
}

WindsorAdapter は、CustomizationsAutoFixture の責任ツリーのかなり早い段階にあるコレクションに含まれているため、すべての (またはほとんどの) 着信要求を処理する機会が得られます。要求が Type インスタンスであり、WindsorContainer にその型のコンポーネントがある場合、アダプターは型を解決する作業をコンテナーに委任します。

それ以外の場合は、インスタンスを返しNoSpecimenます。これは基本的に、この特定の ISpecimenBuilder が要求を処理できなかったことを通知する AutoFixture の方法です。AutoFixture の責任ツリー内の他のコンポーネントが、要求を処理する機会を得ます。

于 2012-08-14T19:01:16.403 に答える