是否有可以在代码中使用Autofixture属性而不是fixture.Inject()?

时间:2016-12-21 02:19:24

标签: entity-framework moq xunit autofixture

我正在针对Entity Framework 6存储库创建测试。由于产品类型和贷款之间存在依赖关系,因此在使用Autofixture.AutoMoq时出现循环引用错误。是否有可以放置在测试方法上的属性,因此我可以删除以下代码行(以及下面示例中的相关项):"fixture.Inject(Enumerable.Empty<Loan>());"

我正在使用XUnit 2.1.0.3179,Autofixture 3.50.2.0,Autofixutre.AutoMoq 3.50.2.0,AutoFixture.Xnit2,Moq 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);

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

提前感谢您的时间和建议。

麦克

1 个答案:

答案 0 :(得分:2)

您可以使用自定义来执行此操作,并将自己的自定义包装到属性中。

以下是自定义的示例:

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

您可以将自定义包装到实现ICustomization的类中,最后遵循Mark Seemann在Encapsulating AutoFixture Customizations中的指导,您可以将所有内容完美地包含在属性中,这样您就可以:

[Theory, AutoMoqData, MyCustomizations]
public void ProductTypes_GetList()