2012-10-29 9 views
5

我真的很欣赏AutoFixture与XUnit理论相结合的力量。我最近采用了encapsulating customizations,并通过属性将它们提供给我的测试。如何修改我的自定义理论数据属性为AutoFixture创建的夹具?

在某些场合,我需要一次性场景来运行我的测试。当我像上面一样使用AutoDomainDataAttribute时,我可以问一个IFixture并期望获得由属性创建的同一个实例吗?

在我的方案中,默认情况下使用MultipleCustomization作为集合等。但是,在这种情况下,我只想将单个项目发送到我的SUT的构造函数。所以,我已经定义了我的测试方法,如下所示:

[Theory, AutoDomainData] 
public void SomeTest(IFixture fixture) { 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    ... 
} 

不幸的是,创建匿名产品时出现异常。其他测试工作得很好,如果我要求产品作为具有这些属性的方法参数。这只是一个问题,在这个特定的情况下,我希望fixture参数是由我的AutoDomainDataAttribute创建的。

产品的构造函数需要一个通常由3个项目填充的IEnumerable,这是由于我通过AutoDomainData就地实现了自定义。目前,我的DomainCustomization是由MultipleCustomization和AutMoqCustomization组成的CompositeCustomization,按此顺序。

例外情况是:“InvalidCastException:无法投射类型为'Castle.Proxies.ObjectProxy'的对象以键入'Product'。”

回答

7

如果您需要相同的夹具实例作为属性中的一个活动,你可以注入灯具到自身的定制,这样的:

public class InjectFixtureIntoItself : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Inject(fixture); 
    } 
} 

只记得在此之前添加到您的CompositeCustomization AutoMoqCustomization,因为IFixture是一个接口,并且如果AutoMoqCustomization首先出现,您将获得一个Mock实例 - AFAICT,这就是动态Castle代理目前正在发生的事情。


但是,如果你真的需要夹具的实例,为什么不写一个正,当务之急测试方法:

[Fact] 
public void SomeTest() 
{ 
    var fixture = new Fixture().Customize(new DomainCustomization()); 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    // ... 
} 

在我看来,要容易得多......我偶尔做到这一点我自己太...


不过,我想知道,如果你不能词组您的API或测试的情况下以不同的方式,使整个问题消失。我非常很少发现,我必须操纵RepeatCount财产这些天,所以我想知道你为什么要这样做?

这可能是一个单独的堆栈溢出问题的主题,但...

+0

谢谢你,马克。在发布之后,我立即转向了命令式测试方法。尽管知道替代方案是很好的。最后,我的特殊测试是确保最后一个类别不能从产品中删除(必须至少有一个)。这是我唯一需要控制'RepeatCount'的时间。再次感谢! – ventaur

+0

难道你不能只是删除'类别。Count() - 1'项目首先作为您的测试设置的一部分,然后只测试一个左侧,您不能删除最后一个? –

+0

是的,我想是的。我们的程序员有时会因复杂的事情而苦恼。 :-) – ventaur

相关问题