2012-08-14 52 views
6

我是AutoFixture的新手,所以我不知道下面的想法是否有意義或者是合理的做法。我有一個應用程序,我負責集成測試,它大量使用Castle Windsor。爲了簡化依賴關係管理並使我的測試更像應用程序代碼,我一直在我的測試初始化​​方法和使用容器中構建Windsor容器。解析實例化我正在測試的代碼。我想擺脫這種方式,因爲它限制了我在某些情況下的靈活性。使用AutoFixture集成測試應用程序的技巧使用Castle Windsor

我希望做的是有一個看起來像這樣的測試:

[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的實現映射中。

+0

Welp!我只是看看AutoMoq的代碼,並看到了如何做我想做的事情。如果有人感興趣,我可以在代碼中發佈代碼。 – thebeekeeper 2012-08-14 18:21:17

+0

是的,這與AutoMoq的工作方式非常接近:) – 2012-08-14 19:02:12

回答

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坐在Customizations集合,這是在責任AutoFixture的樹相當早的,所以它得到一個機會來處理每一個(或最)傳入的請求。如果請求是一個Type實例,並且WindsorContainer具有該類型的組件,則適配器將解析類型的工作委託給容器。

否則,它將返回一個NoSpecimen實例,這基本上是AutoFixture的信號方式,表示此特定ISpecimenBuilder無法處理請求。 AutoFixture責任樹中的某些其他組件然後有機會處理請求。

+1

是的,這正是我所做的。令人興奮的是,由於我測試的代碼僅實現了1/3,所以我應該能夠使用AutoMoq來代替不存在的代碼,並且仍然測試存在的代碼。大圖書館! – thebeekeeper 2012-08-14 20:03:25

+0

是的,您只需確保AutoMoqCustomization自帶的最後一個/以後:http://blog.ploeh.dk/2012/07/31/TheOrderOfAutoFixtureCustomizationsMatter.aspx – 2012-08-15 05:25:26

相關問題