C# EntityFramework核心单元测试-SQLite内存模式与InMemory提供程序

C# EntityFramework核心单元测试-SQLite内存模式与InMemory提供程序,c#,unit-testing,.net-core,entity-framework-core,C#,Unit Testing,.net Core,Entity Framework Core,我正在为一个使用EntityFramework Core的项目编写单元测试,根据我可以使用SQLite内存模式或InMemory提供程序来近似数据库上下文。 文档说明SQLite在内存模式下的行为类似于关系数据库,而InMemory提供程序的行为并不总是类似于关系数据库。 据我所知SQLite模式听起来更好,因为它的行为类似于关系数据库,而内存提供程序则没有,但我想还有其他方面需要考虑,否则没有人会使用内存提供程序这听起来更糟糕。 在选择哪种工具之前,我应该考虑每种方法的其他优点和缺点吗? <

我正在为一个使用EntityFramework Core的项目编写单元测试,根据我可以使用
SQLite内存模式
InMemory提供程序
来近似数据库上下文。

文档说明
SQLite在内存模式下的行为类似于关系数据库,而
InMemory提供程序的行为并不总是类似于关系数据库。

据我所知SQLite模式听起来更好,因为它的行为类似于关系数据库,而内存提供程序则没有,但我想还有其他方面需要考虑,否则没有人会使用<代码>内存提供程序这听起来更糟糕。


在选择哪种工具之前,我应该考虑每种方法的其他优点和缺点吗?

< P>如果你的唯一目的是编写单元测试,那么仔细看看创建测试所需的锅炉板代码,这可能会影响你的最后期限。我会选择让我输入更少代码的选项!(
内存提供程序
看起来更简单)

查看样本并决定:

…当然,您的项目将进行集成测试,在这些测试上,您将连接到真实的数据库并进行额外的检查。这就是为什么对于单元测试,我主要关心的是编写时间,而不是根据文档,模拟数据库的行为 如果您对SQLLite使用InMemory提供程序,则在加载关系数据时几乎没有行为差异

例如,如果有相关的子记录。对所有孩子使用LINQ 记录将自动加载,这与实际情况不同 需要显式调用include函数的数据库

另一种情况是连接到远程位置的数据库时I/O性能的差异

建议包括一些真实的测试,以免以后对真实的应用程序性能和行为感到惊讶

根据我的经验(我是本文的作者),每个数据库平台都有自己的小怪癖,它们的行为往往略有不同(例如,查看的Supports属性中的注释)。即使使用EF似乎将所有内容都从您身上抽象出来,在测试中也可能会出现细微的差异,给您带来假阳性或假阴性

因此,我给您的建议是:使用您想要支持的实际数据库平台进行集成测试(即使创建、删除SQL Server数据库也不会花费太多时间,还有其他一些策略可以优化涉及数据库的集成测试)。对于您的业务逻辑,使用后台没有数据库的冒烟测试


这还有一个额外的好处,那就是您可以将类设计的数据库访问与业务逻辑分开。

我不同意基于意见的投票。客观地列举优点和缺点对社区来说是很有价值的。不幸的是,我认为这还不够成熟,有些人还没有充分利用它来告诉你可能发生的恐怖故事。我完全不同意这里关注的锅炉板代码——它可以被适当地重构为共享方法——不应该显著增加您的足迹。但是我同意你关于单元测试和集成测试之间区别的评论。我认为你应该在回答中加上这句话。