如何在Entity Framework中模拟ObjectContext或ObjectQuery?
基本的模拟框架只能为接口和抽象类创建模拟(但仅适用于抽象/虚方法).
由于ObjectContext既不是抽象也不是接口,因此模拟它并不容易.但是,由于具体模型容器是作为部分类生成的(如果使用设计器),您可以从中将所需的方法/属性提取到接口.在您的代码中,您可以仅使用界面,然后您可以模拟.
使用ObjectQuery它更容易,因为它有一个基本接口(例如IQueryable),基本上包含您通常需要的所有必要操作(以及LINQ所需的操作).因此,您应该在业务逻辑中公开IQueryable而不是ObjectQuery,并且可以为该接口创建模拟.
另一种方法是将所有与数据访问相关的逻辑隐藏到一个单独的层中(使用最少的逻辑),使用集成测试测试该层,并模拟它以便能够对其他层进行单元测试.
有一些工具(我只知道TypeMock)使用.NET的分析钩子来生成模拟.这些工具不仅限于模拟接口或抽象类,但使用它们,您可以基本上模拟任何东西,包括非虚拟和静态方法.使用这样的工具,您无需更改业务逻辑即可进行模拟.
虽然这种方法有时很有用,但您必须意识到,将依赖项提取到接口(IoC)不仅有助于模拟,而且还可以减少组件之间的依赖关系,这也有其他好处.
我个人喜欢Rhino.Mocks最好的免费软件工具,但我们也使用TypeMock,这也是一个很棒的产品(但你必须付钱).