【发布时间】: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