【问题标题】:InMemoryDatabase faking the System.Data.Entity.Database propertyInMemoryDatabase 伪造 System.Data.Entity.Database 属性
【发布时间】:2017-10-12 08:26:46
【问题描述】:

在我们的应用程序中,过去没有测试。
目前我正在重构我们的代码,以便我们可以编写验收和单元测试。要做的是,我需要对数据库进行抽象。我们使用 Entity Framework 6 作为我们的 ORM。

我创建了一个实现接口的InMemoryDb 类,EF-Context 也实现了该接口。

EF-DbContext 类提供了一个名为Database 的属性,类型为System.Data.Entity.Database

不幸的是,在我们的代码中,这个属性被多次使用,例如:

Connection = (SqlConnection)dbBase.Entities.Database.Connection;

在验收测试的情况下,Entities 的类型为 InMemoryDb。 问题是,在验收测试中,Database 属性是 null,我不知道如何正确设置该属性。

我尝试在构造函数中像这样初始化它,但它不起作用:

public class InMemoryDb : IEfContext, IInMemoryDb
{
    public InMemoryDb()
    {
        this.per_person = new TestDbSet<per_person>();
        this.Database = new Database(null);
    }
    public void Dispose()
    {
        throw new System.NotImplementedException();
    }

    public Task<int> SaveChangesAsync()
    {
        throw new System.NotImplementedException();
    }

    public Database Database { get; }

    public DbSet<per_person> per_person { get; set; }

    [...]
}
  • 在确保不使用真实数据库的同时设置此属性的正确方法是什么?

提前致谢

【问题讨论】:

  • 你没有使用数据库上下文吗???
  • 我在生产代码中。但是对于我的测试代码(验收测试),我不想使用真正的数据库
  • “验收测试”的目的是测试整个应用程序的“管道”——因此您知道所有层都正确集成。您的测试与“集成测试”非常接近。因为您创建了自己的“伪造”的 Context 实现 - 您应该继续实现实际代码使用的所有部分。如果不可能,那么您应该考虑改变方法:通过将使用 .Database 属性的部分放在另一个抽象后面来重新设计应用程序,或者 - 更好的方法是使用真实或 SQLLight 数据库来运行“实际”接受测试

标签: c# .net entity-framework unit-testing


【解决方案1】:

希望对你有所帮助。 看看 Effort.EF6。该库将在 NMemory 的帮助下设置您的整个应用程序数据(baseI 上下文在内存中。 我已经在我们的应用程序中使用了它,它就像一个魅力,而且非常易于使用。

您与外部物理依赖项(如 SQL Server 或 SQL Server 中的数据库)完全解耦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多