entity-framework - 代码中是否有可以代替 fixture.Inject() 的 Autofixture 属性?

标签 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);

我很乐意了解是否有可能实现我的目标并减少代码行数。

提前感谢您抽出宝贵的时间和建议。

迈克

最佳答案

您可以使用定制来做到这一点,并将您自己的定制包装到一个属性中..

这是一个自定义示例:

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

您可以将自定义包装到一个实现 ICustomization 的类中,最后按照 Encapsulating AutoFixture Customizations 中的指导进行操作通过 Mark Seemann,您可以将所有这些很好地包装到一个属性中,这样您就可以:

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

关于entity-framework - 代码中是否有可以代替 fixture.Inject() 的 Autofixture 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41254113/

相关文章:

C# Entity Framework Core - 对象名称无效,无法更新数据库

c# - 使用 Rhino Mocks 默认返回空列表

c# - 如何模拟多个级别的 DbSet.Include lambda?

c# - Redis StringSetAsync 在使用 Moq 的单元测试中返回 false

c# - 在构造函数和析构函数中输出时运行一次初始化和拆卸代码

c# - 将 OpenCover 与 xUnit 集成

c# - LINQ to Entities - 查询中的 Where IN 子句

.net - Entity Framework 与表示层分离

c# - 当没有任何内容为 null 时出现 NullReferenceException?

unit-testing - IMapper 模拟返回 null