2016-12-21 12 views
2

我正在创建一个实体框架6存储库的测试。由于产品类型和贷款之间的依赖关系,使用Autofixture.AutoMoq时会出现循环引用错误。是否有一个属性,我可以放在一个测试方法,所以我可以消除下面的代码行(和在下面的例子中的相关项目,下面):"fixture.Inject(Enumerable.Empty<Loan>());"是否有一个Autofixture属性可以用来代替夹具中的fixture.Inject()?

我使用XUnit 2.1.0.3179,Autofixture 3.50.2.0 ,Autofixutre.AutoMoq 3.50.2.0,AutoFixture.Xnit2,起订量4.5.29.0

这里有一些额外的细节,它可以是有帮助...

贷款(N)---(1)ProductType

由于在我的EF6模型中的循环参考,我不能做到以下几点:

[Theory, AutoMoqData] 
public void ProductTypes_GetList() 
    List<ProductType> productTypeList, 
    [Frozen] Mock<IProductTypeRepository> productTypeRepo) 
{ 

相反,我必须做到以下几点,以避免循环引用问题:

var fixture = new Fixture().Customize(new AutoMoqCustomization()); 
    // Avoid circular dependency in EF. 
    // Eliminating the many side of the relationship. 
    fixture.Inject(Enumerable.Empty<Loan>()); 

    var productTypeRepo = fixture.Freeze<Mock<IProductTypeRepository>>(); 

    // Create a list of product types. 
    List<ProductType> productTypeList = fixture.Create<List<ProductType>>(); 

    productTypeRepo.Setup(_ => _.GetAll()).Returns(productTypeList); 

我希望了解是否有可能实现我的目标,减少代码的行数。

预先感谢您的时间和建议。

迈克

回答

2

您可以使用自定义要做到这一点,并且包裹自己的自定义成一个属性..

继承人定制的例子:

fixture.Customize<ProductType>(x => x.Without(y => y.ProductTypes)); 

你可以用自定义了实现ICustomization并最终遵循Mark Seemann的Encapsulating AutoFixture Customizations中的指导,您可以将所有这些都很好地包装到属性中,以便您可以执行此操作:

[Theory, AutoMoqData, MyCustomizations] 
public void ProductTypes_GetList() 
相关问题