Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试实体框架3.5_C#_Unit Testing_Entity Framework - Fatal编程技术网

C# 测试实体框架3.5

C# 测试实体框架3.5,c#,unit-testing,entity-framework,C#,Unit Testing,Entity Framework,当我仅限于EF 3.5实体时,编写单元测试的最佳方法是什么?如果您试图自己对查询进行单元测试,我强烈建议您只需设置一个测试数据库并使用真实数据对其进行测试。使用IObjectSet来代替内存中的集合来运行单元测试是个坏主意。在linq to对象下运行linq查询的方式与将其解析为T-SQL命令的方式之间存在差异,即NULL的处理方式。比如说, db.People.Where(p => p.AccountNum == variable); 如果这是使用linq to对象(就像在一些内存对象

当我仅限于EF 3.5实体时,编写单元测试的最佳方法是什么?

如果您试图自己对查询进行单元测试,我强烈建议您只需设置一个测试数据库并使用真实数据对其进行测试。使用
IObjectSet
来代替内存中的集合来运行单元测试是个坏主意。在linq to对象下运行linq查询的方式与将其解析为T-SQL命令的方式之间存在差异,即NULL的处理方式。比如说,

db.People.Where(p => p.AccountNum == variable);
如果这是使用linq to对象(就像在一些内存对象集中,您已经在其中作为单元测试的
IObjectSet
的替代品),那么它将运行得很好。然而,如果您在数据库上运行它,那么如果变量为null,您的查询将中断,因为

WHERE [peopleTableAlias].[AccountNum] = @param1
将生成,其中@param1为null,这将毫无价值,因为您确实需要生成一个IS null查询


但是,如果您想测试调用EF datacontext的业务逻辑,那么我会说将这些查询封装到DataAccess对象中,将您的方法标记为虚拟的,在需要的地方注入所述DAO,并在单元测试中替换覆盖这些方法以返回测试所需值的手动模拟,或者用你最喜欢的模拟框架(比如Rhino)做同样的事情


编辑-抱歉,
IObjectSet
仅限于EF4,显然您没有EF4。但是,由于我建议不要在单元测试中使用它,所以答案仍然适用。

您想在单元测试中使用什么?你能提供更多关于你正在尝试做什么或遇到什么问题的信息吗?我要测试的类是DAL。因此,设置测试数据库似乎是正确的做法。关于使用测试数据库或任何我需要注意的事情,你有什么好的建议吗?主要的是在每次测试后自己清理,这样一个测试的数据不会干扰下一个测试。显然,您可以在测试之间手动删除测试数据,但我也读过关于使用TransactionScope包围测试,然后将其回滚,而不是在测试后提交,以防止数据实际粘附到数据库。我还没试过,所以我说不出它有多好