测试Entity Framework 3.5

3

当我只能使用EF 3.5实体时,编写单元测试的最佳方法是什么?


你正在尝试进行单元测试的是什么?你能提供更多关于你正在尝试做什么或遇到了什么问题的信息吗? - Jeff
1个回答

0

如果您正在尝试对查询本身进行单元测试,我强烈建议设置一个测试数据库,并使用真实数据进行测试。在单元测试中使用IObjectSet<T>来替换内存集合是一个不好的想法。在linq-to-objects下运行linq查询和将其解析为T-SQL命令之间存在差异,特别是在处理null值时。例如,

db.People.Where(p => p.AccountNum == variable);

如果使用的是linq-to-objects(例如,您已经将某些内存对象集替换为用于单元测试的>),那么它将完美运行。但是,如果您正在针对数据库运行,则如果变量为空,则查询将中断,因为查询

WHERE [peopleTableAlias].[AccountNum] = @param1

将生成一个带有 @param1 为空的查询,这是没有意义的,因为您真正需要生成一个 IS NULL 查询。


如果您想测试调用EF数据上下文的业务逻辑,那么我建议将这些查询封装到DataAccess对象中,将方法标记为虚拟的,在需要它们的地方注入DAOs,在单元测试中使用手动模拟或者使用您喜欢的模拟框架(如Rhino)来替换这些方法以返回所需的值。
编辑-抱歉,IObjectSet仅限于EF4,而您显然没有。但是,由于我建议不要在单元测试中使用它,因此答案仍然适用。

我要测试的类是一个数据访问层(DAL)。因此,设置一个测试数据库似乎是正确的方法。您有关于使用测试数据库的好建议或需要注意的事项吗? - Ols1
主要的事情是在每次测试之后清理自己的数据,这样一个测试的数据就不会干扰下一个测试。你可以手动在测试之间删除测试数据,但我也读过关于使用TransactionScope来包围你的测试,然后在测试结束后将其回滚而不是提交,以防止数据实际上被保留在数据库中。虽然我从未尝试过这种方法,因此无法说它运行得有多好。 - Adam Rackis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接