具有实体框架代码优先的数据访问层的集成测试

时间:2014-04-28 11:12:47

标签: c# entity-framework integration-testing

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

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

1)那么有没有办法在内存数据库中使用一些?
a)如果我的测试项目中没有使用连接字符串,看到一切正常,但这个数据库在哪里创建? b)EF为每次测试创建一次或仅在第一次测试开始时创建?我可以用明确的方式创建它吗? c)如何删除此数据库?

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

由于

编辑: 我的小例子:

如果我映射我的班级:

MyClass{
    public int MyClassIdField
    public string MyClassDescriptionField
}

到表[T01_Table1],带字段
int_T01_Table1Id
nvc_T01_Table1Description

我想为这个映射定义一个测试,用于测试正确性和从测试驱动开发的角度来看

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

编辑2: 同时我使用本地数据库继续查找其他问题: 我用这种方式创建了一个类:

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

但测试失败并出现此错误:
失败:预计日期和时间为&lt; 2014-02-22 16:14:53.901&gt;,但发现&lt; 2014-02-22 16:14:53.900&gt;。

如果不成功配置上下文测试。 数据如何变化?

1 个答案:

答案 0 :(得分:1)

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

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