C# 为内存中的DbContext设置自动夹具

C# 为内存中的DbContext设置自动夹具,c#,entity-framework,mocking,entity-framework-core,autofixture,C#,Entity Framework,Mocking,Entity Framework Core,Autofixture,我目前正在尝试使用Autofixture创建预定义的fixture,作为for ApplicationDbContext的实现,使用 公共类ApplicationDbContextFixture:ICCustomization { 公共空间自定义(iTexture装置) { var specimenFactory=新的specimenFactory 奇怪的是,如果我从工厂方法(即从fixture.Create调用的CreateDbContext())检查断点 或者,我知道我可以将dbContex

我目前正在尝试使用Autofixture创建预定义的fixture,作为for ApplicationDbContext的实现,使用

公共类ApplicationDbContextFixture:ICCustomization
{
公共空间自定义(iTexture装置)
{
var specimenFactory=新的specimenFactory

奇怪的是,如果我从工厂方法(即从
fixture.Create调用的
CreateDbContext()
)检查断点

或者,我知道我可以将
dbContext.Users
的所有用法替换为
dbContext.Set()
,这将使单元测试通过,但问题是在实际的类中,我将
dbContext.Users
用于和数据库操作,因此如果可能,我仍然需要坚持使用它

因此,我需要帮助了解为什么AutoFixture使用我的factory方法为我的ApplicationDbContext生成实例,但当由ISpecimenBuilder解析时,其中的所有
DbSet
属性都会被模拟。是否有办法解决此问题

我已经在中发布了类似的问题,但最近它并不活跃,所以我也在这里提问

请理解,我是在两天前才开始使用Autofixture的。因此,如果我写错了什么东西,或者在任何设计模式中存在误解,请写一条评论,以便我可以吸取教训

更新1: 因此,我尝试在没有任何AutoMoq自定义的情况下使用初始化的普通夹具(即,
fixture=newfixture()
)这一次它抛出了一个
AutoFixture.ObjectCreationExceptionWithPath
异常,抱怨它无法解析ApplicationDbContext中的DbSet属性。此时,我在想,是否有人知道如何使用中继或ISpecimenBuilder来告诉AutoFixture使用/调用/实现所有
DbSet
属性使用
dbContext.Set设置ApplicationDbContext,因为如果我在单元测试中替换所有使用的dbset,这将起作用,但正如我所提到的,所有IQueryable都是从dbset返回的,因此我不能简单地在ApplicationDbContext中替换它

更新2
我从我的工厂方法CreateDbContext()中删除并简化了ApplicationDbContext的创建,因为这会导致代码复杂性的混乱。

很难理解您试图从文章中获得什么

我认为您实际需要的是测试碰巧使用EntityFramework的代码。 如果是这种情况,您可能想看看这个库,我已经创建了。它使用内存中数据库提供程序以及SQLite内存中提供程序


查看自述文件中的一些代码示例。如果您有任何问题,请向我发送一条消息或在GitHub上打开一个问题。

您应该这样断言:
assert.Empty(dbContext.Users.ToList());
?您需要运行EF execution命令,在本例中为
ToList()
。Hi@Olegl,将其添加到ToList())正如在我的原始代码中所提到的那样,因为Autofixture正在将类型
DbSet
的所有属性模拟为模拟,因为我使用了工厂方法中的
AutoMoqCustomization
。当我现在编写Update 1时,我发现对我的
ApplicationDBContent使用无任何自定义异常的普通FixturextFixture
将向我抛出一个
AutoFixture.ObjectCreationExceptionWithPath
异常,其中AutoFixture无法派生DbSet的实现。虽然可以为ApplicationDbContext中的每个相关属性为每种类型的DbSet设置每个fixture,但这将非常繁琐,因为我有很多DbSet。此外,dbCo即使在我最初的情况下,ntext.Set也可以很好地工作,所以我在考虑某种解决方案,使用一个中继或另一个ISpecimenBuilder来帮助解析所有DbSet,以便自动从dbContext.Set派生。但是我不知道如何使用Autofixture atm处理这些问题。您在这里尝试测试什么?看起来像是您在测试st Entity Framework本身单元测试是POC,用于显示调用
fixture.Create,这是您编写测试双倍以模拟EF行为的方式。引自:“您可能希望使用近似连接到真实数据库的东西来测试组件,而不需要实际数据库I/O操作的开销。”您好,谢谢回复@Andrew。我已经尝试过了,并在Github线程中留下了我的评论。在这里,我会将此标记为答案,因为它满足了我所寻找的基本要求(即使用Autofixture和内存Db为DbContext创建fixture)。但是,我确实遇到了一些问题,因此我在最初的github帖子上给您留下了一些问题。为这项伟大的工作干杯。@谢谢您。您在github线程上提到的问题现在已修复,可在最新的预览版本中下载。不久将发布完整版本。
    /// <summary>
    /// Factory method to declare a single <see cref="IFixture"/> for unit tests applications
    /// </summary>
    internal static class FixtureFactory
    {
        internal static IFixture CreateFixture()
        {
            var fixture = new Fixture().Customize(
                new AutoMoqCustomization { ConfigureMembers = true });

            return fixture;
        }
    }