数据访问层与实体框架代码的集成测试

本文关键字:代码 集成测试 框架 实体 访问 数据 | 更新日期: 2023-09-27 18:00:34

iam开始为我的数据访问层编写测试,并寻找最佳实践。

现在,每次在我的模型中发现一些差异(用代码优先的流畅映射定义)时,都会自动从EF生成一个真实的数据库进行iam测试,但与许多开发人员一起进行测试是很困难的,因为每个开发人员都开发了不同的对象。

1) 那么有什么方法可以使用内存中的数据库呢
a) 如果在我的测试项目中不使用连接字符串,那么一切都很好,但这个数据库是在哪里创建的
b) EF为每次测试创建一次,还是仅在第一次测试开始时创建?我可以以明确的方式创建它吗
c) 如何删除这个数据库

2) 我要测试什么
a) 在我过去的应用程序中,我在将对象属性映射到db列时犯了很多错误,所以这似乎是一件需要测试的事情:也许我可以创建一个对象,将其保存到db,从db读取它,并测试所有读取的属性是否等于我写的属性
b) 我想我会使用存储库模式,所以每个对象都会有自己的带有CRUD操作的存储库,我必须测试这个CRUD,或者这意味着iam测试EntityFramework本身
c) 过了一段时间,我的存储库中会有很多列表方法,所以我必须在数据库中插入一些假数据,并尝试对它们进行查询以测试我的方法
d) 其他要测试的东西?

感谢

编辑:i很小的例子:

如果我绘制我的班级地图:

MyClass{
    public int MyClassIdField
    public string MyClassDescriptionField
}

至表格[T01_Table1],其中字段
int_T01_Table1Id
nvc_T01_Table1说明

我想为这个映射定义一个测试,既是为了测试正确性,也是从测试驱动开发的角度

其他问题:当iam在db中测试插入操作时,我可以直接使用我的域层对象,或者我必须模拟它们
如果没有mock,我必须使用无法运行的对象构造函数

第2版:与此同时,iam使用本地数据库继续查找其他问题:我用这种方式创建一个类:

var fixture = new Fixture();
MyClass c = New MyClass();
c.id = fixture.Create<int>();
c.endDate= fixture.Create<DateTime?>();
context.MyClass.Add(c);
context.SaveChanges();
context.Dispose(); // TO force EF query on DB
context= new MyContext();
MyClass actual = context.MyClass.Find(c.Id);
//Assert
actual.DataFine.Value.Should().Be(target.DataFine.Value);

但测试失败,并出现以下错误:
失败:预期日期和时间为<2014-02-22 16:14:53.901>,但发现<2014-02-22 16:14:53.900>.

如果不处置上下文,则测试成功。数据如何更改?

数据访问层与实体框架代码的集成测试

当单元测试时,一个很好的经验法则是不要测试范围之外的代码。这意味着不测试数据库本身,而是使用Moq之类的模拟库来模拟数据库。

编辑:关于集成测试。如果你想测试数据库本身,你需要使用一个真实的数据库,否则你不会测试数据库引擎,而是测试一个模拟的数据库引擎,这会错过测试的目标。正如您所提到的,使用mdf文件是一种可行的方法。