是否有entity framework的内存提供者?
我是针对ADO .NETentity framework编写的unit testing代码。 我想用行填充内存数据库,并确保我的代码正确地检索它们。
我可以用Rhino Mock来嘲笑entity framework,但那还不够。 我会告诉查询什么实体返回给我。 这既不会testingwhere子句也不会testing.Include()语句。 我想确保我的where子句只匹配我打算的行,没有其他的。 我想确定我是否已经要求我需要的实体,而没有我不需要的实体。
例如:
class CustomerService { ObjectQuery<Customer> _customerSource; public CustomerService(ObjectQuery<Customer> customerSource) { _customerSource = customerSource; } public Customer GetCustomerById(int customerId) { var customers = from c in _customerSource.Include("Order") where c.CustomerID == customerId select c; return customers.FirstOrDefault(); } }
如果我嘲笑的ObjectQuery返回一个已知的客户填充订单,我怎么知道CustomerService有正确的where子句和包括? 我宁愿插入一些客户行和一些订单行,然后声明select了正确的客户并填写订单。
目前还没有EF的内存提供者,但是如果你看看Highway.Data,它有一个基本的抽象接口和一个InMemoryDataContext。
用Highway.Datatesting数据访问和EF
EF7中包含一个InMemory提供程序(预发行版)。
您可以使用NuGet包 ,或者在GitHub( 查看源代码 )的EF仓库中阅读它。
一个更好的方法可能是使用Repository模式来封装你的EF代码。 在testing你的服务时,你可以使用嘲笑或假货。 当testing你的仓库时,你会想要打真正的数据库,以确保你得到你期望的结果。
文章http://www.codeproject.com/Articles/460175/Two-strategies-for-testing-Entity-Framework-Effort描述了在内存中运行的Effort- Entity Framework提供程序。
您仍然可以在unit testing中使用您的DbContext或ObjectContext类,而不必拥有一个实际的数据库。
是的,至less有一个这样的提供者 – SQLite 。 我已经使用了一些,它的工作原理。 你也可以试试SQL Server Compact 。 这是一个embedded式数据库,也有EF提供者。
编辑:
SQLite支持内存数据库( link1 )。 您只需指定一个连接string,如“Data Source =:memory:; Version = 3; New = True;”。 如果你需要一个例子,你可以看看SharpArchitecture 。
我不熟悉entity framework和ObjectQuery类,但如果包含方法是虚拟的,你可以像这样嘲笑它:
// Arrange var customerSourceStub = MockRepository.GenerateStub<ObjectQuery<Customer>>(); var customers = new Customer[] { // Populate your customers as if they were coming from DB }; customerSourceStub .Stub(x => x.Include("Order")) .Return(customers); var sut = new CustomerService(customerSourceStub); // Act var actual = sut.GetCustomerById(5); // Assert Assert.IsNotNull(actual); Assert.AreEqual(5, actual.Id);
你可以尝试SQL Server Compact,但是它有一些非常的限制:
- 与entity framework一起使用时,SQL Server Compact不支持分页查询中的SKIPexpression式
- 与entity framework一起使用时,SQL Server Compact不支持具有服务器生成的键或值的实体
- 没有外部连接,整理,浮动模块,聚合