EF4 - 是否可以模拟 ObjectContext 进行单元测试?

7

不使用TypeMock Islolator可行吗?我在网上找到了一些建议,例如传递一个仅包含元数据的连接字符串,但是除了TypeMock之外,我还没有遇到其他任何真正允许为单元测试注入模拟ObjectContext的方法。我是否要投资于购买TypeMock,或者有其他替代方案吗?是否还没有人能够创建与TypeMock类似且开源的工具?


1
我看到的一个建议是打破针对数据库测试的规则。那个人说他使用CreateDatabase()在本地动态创建一个“模拟”数据库实例。总的来说,我想避免这种情况,因为我们在之前的项目中打破了这个规则,结果并不好。在大约600个测试时还可以,但最后超过2000个测试时,它对真正的TDD毫无用处,我们只能偶尔以“批处理模式”运行测试(需要5分钟或更长时间)。 - Steve Macdonald
4个回答

4

1
-1 Linq2Objects的行为与Linq2Entities不同。你的测试可能会通过List<T>,但在EF将其解析为SQL时会失败。 - Casey Burns
没有访问数据库是无法绕过这个问题的,所以我不确定你的观点是什么。模拟并不意味着您的Linq2Entities将始终有效并正常工作。 - KallDrexx
2
将您的查询封装并针对真实数据库进行测试。然后在测试业务逻辑时模拟它们。因此,每个查询都是可重用的组件,您可以确信它能够正常工作。而且,您的业务逻辑经过测试,无需依赖于处于预期状态的数据库。 - Casey Burns

3
将您的Linq2Entity查询放在一个接口后面,在真实数据库上对其进行隔离单元测试。
使用模拟的查询接口编写业务逻辑的测试。不要让Linq渗入您的业务逻辑!
不要使用RepositoryPattern!

1

将 ObjectContext 包装在代理类中,然后将其注入到您的类中。


是的,我尝试过那个方法,这是一种可能性--然而,所有使用代理的方法都有它们自己的限制。首先,Linq的工作方式不同(使用Linq to objects而不是Linq to entities)。 - Steve Macdonald
2
没错,但期望你的单元测试捕捉到不同Linq实现之间的差异似乎有些过分了。这更适合于集成测试领域,你觉得呢? - SamuelWarren

0

我认为仓储模式并不是问题的唯一答案(当然,它可以避免问题)

我喜欢这个答案 - 我认为更适合在现有代码库中引入测试 创建 ObjectContext 的接口


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