2012-03-09 60 views
2

我在整个项目中都使用Entity Framework 4,Ninject和Moq。当我使用EF4服务类的肉时,我实例化了一个数据上下文 - 这很糟糕。如何EF4 + Ninject + Moq?

我要注入数据上下文为我服务,让我的单元测试可以针对虚拟数据方面的工作。我之前使用nHibernate完成了这个工作,但是我无法用EF4来解决这个问题,而且在网上找不到一个可靠的例子。

任何人都可以指出我的工作解决方案和例子吗?非常感谢!

回答

4

建议的方法是使用一个内存数据库来测试针对(使用SQLite),类似的技术如在NHibernate 3.0 cookbook描述测试NHibernate的。

您也可以创建一个假的DbContext的描述看here

+0

这可能是我找到的最好的例子,但它跳过了如何整合实际触及数据库的代码,而只是谈论如何模拟一切: 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

+2

该示例使用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

+0

其中一个观点是,如果您使用存储库并模拟实现,那么您不测试实体框架,并且您的LINQ查询可能会在生产中失败,因此集成测试与内存数据库实际上测试EF。 – devdigital 2012-03-09 20:44:34

0

在我的公司,我们使用本地开发数据库和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(); 
     } 
    } 
} 

我希望这可以帮助你。