如何模拟ObjectContext或ObjectQuery 在实体框架?

.net-3.5 entity-framework mocking unit-testing

如何在Entity Framework中模拟ObjectContext或ObjectQuery?

热门答案

基本的模拟框架只能为接口和抽象类创建模拟(但仅适用于抽象/虚方法)。

由于ObjectContext既不是抽象也不是接口,因此模拟它并不容易。但是,由于具体模型容器是作为部分类生成的(如果使用设计器),您可以从中将所需的方法/属性提取到接口。在您的代码中,您可以仅使用界面,然后您可以模拟。

使用ObjectQuery它更容易,因为它有一个基本接口(例如IQueryable),基本上包含您通常需要的所有必要操作(以及LINQ所需的操作)。因此,您应该在业务逻辑中公开IQueryable而不是ObjectQuery,并且可以为该接口创建模拟。

另一种方法是将所有与数据访问相关的逻辑隐藏到一个单独的层中(使用最少的逻辑),使用集成测试测试该层,并模拟它以便能够对其他层进行单元测试。

有一些工具(我只知道TypeMock )使用.NET的分析钩子来生成模拟 。这些工具不仅限于模拟接口或抽象类,但使用它们,您可以基本上模拟任何东西,包括非虚拟和静态方法。使用这样的工具,您无需更改业务逻辑即可进行模拟。

虽然这种方法有时很有用,但您必须意识到,将依赖项提取到接口(IoC)不仅有助于模拟,而且还可以减少组件之间的依赖关系,这也有其他好处。

我个人喜欢Rhino.Mocks最好的免费软件工具,但我们也使用TypeMock ,这也是一个很棒的产品(但你必须付钱)。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因