我在整个项目中都使用Entity Framework 4,Ninject和Moq。当我使用EF4服务类的肉时,我实例化了一个数据上下文 - 这很糟糕。如何EF4 + Ninject + Moq?
我要注入数据上下文为我服务,让我的单元测试可以针对虚拟数据方面的工作。我之前使用nHibernate完成了这个工作,但是我无法用EF4来解决这个问题,而且在网上找不到一个可靠的例子。
任何人都可以指出我的工作解决方案和例子吗?非常感谢!
我在整个项目中都使用Entity Framework 4,Ninject和Moq。当我使用EF4服务类的肉时,我实例化了一个数据上下文 - 这很糟糕。如何EF4 + Ninject + Moq?
我要注入数据上下文为我服务,让我的单元测试可以针对虚拟数据方面的工作。我之前使用nHibernate完成了这个工作,但是我无法用EF4来解决这个问题,而且在网上找不到一个可靠的例子。
任何人都可以指出我的工作解决方案和例子吗?非常感谢!
建议的方法是使用一个内存数据库来测试针对(使用SQLite),类似的技术如在NHibernate 3.0 cookbook描述测试NHibernate的。
您也可以创建一个假的DbContext的描述看here。
在我的公司,我们使用本地开发数据库和TransactionScope来回滚更改。测试刀片时独特的副作用是增加身份,但这不是问题。
好处是你有一个真正的测试数据库。
如果您需要发送电子邮件或发送数据到另一台服务器,然后再回到IoC和依赖注入,使用ninject /最小起订量。
您需要将实体框架和连接字符串添加到您的测试项目中。
[TestClass]
public class NameValueTest
{
[TestMethod]
public void Create()
{
NameValueController controller = new NameValueController();
using (var ts = new TransactionScope())
{
Assert.IsNotNull(controller.Create(new Models.NameValue()
{
name1 = "1",
name2 = "2",
name3 = "3",
name4 = "4"
}));
//no complete, automatically abort
//ts.Complete();
}
}
}
我希望这可以帮助你。
这可能是我找到的最好的例子,但它跳过了如何整合实际触及数据库的代码,而只是谈论如何模拟一切: http://blogs.msdn.com/ b/adonet/archive/2009/12/17/walkthrough-test-driven-development-with-the-entity-framework-4-0.aspx 我希望找到一个EF4项目的工作示例, db,然后如何修改它,以便进行DI,嘲讽/测试等。 – znelson 2012-03-09 20:32:26
该示例使用EF上的存储库模式,这将允许您模拟存储库实现。然而,没有使用带有ORM的存储库有很好的参数。请参阅http://stackoverflow.com/questions/5625746/generic-repository-with-ef-4-1-what-is-the-point/5626884#5626884。此外,请参阅http://stackoverflow.com/questions/5609508/asp-net-mvc3-and-entity-framework-code-first-architecture/5610685#5610685关于使用集成测试的讨论。 – devdigital 2012-03-09 20:42:09
其中一个观点是,如果您使用存储库并模拟实现,那么您不测试实体框架,并且您的LINQ查询可能会在生产中失败,因此集成测试与内存数据库实际上测试EF。 – devdigital 2012-03-09 20:44:34