2012-02-03 65 views
0

我希望能够编写测试代码。但我的行动是耦合到我的DataContext。我怎样才能消除依赖?如何解耦控制器中的依赖关系?

public ViewResult About() 
    { 
     var db = new CamaDataContext(); 

     var item = new PropertyViewModel(); 


     AutoMapper.Mapper.Map(db.dataProperty.FirstOrDefault(),item); 

     return View(item); 
    } 

回答

1

使用依赖注入框架(例如ninject或structuremap)通过控制器的构造函数传递它,然后在编写测试时,可以在思想构造函数中传递这些依赖项。

这也将提供您有机会嘲笑那些depenedencies出来,实际上并没有对您的数据库调用同时测试

2
  1. 为不同的实体创建存储库接口。

  2. 为不同的实体创建具体存储库。

  3. 将这些存储库存储在控制器级别。

  4. 使用Controller的构造函数允许注入库(如果没有提供,则使用具体实现)。

这将允许您在单元测试期间模拟库,以使两者不紧密耦合。

+0

的仓库也应与工作单位相关的,否则他将不得不与存储库(除非他不希望事务支持)混合数据库代码。 – 2012-02-03 19:26:35

+0

@ChristopherHarris - 我把那一部分拿出来了。这完全取决于系统的构建方式。如果他们正在使用依赖注入,那么您可以将管理上下文的责任推到那里,使得存储库不必担心上下文。 – 2012-02-03 19:31:14

+0

有人可以通过将我的回购与工作单元关联来详细说明您的意思吗? – 2012-02-03 21:23:39

1

您可以轻松地重构上面的代码来测试它(假设你有一些业务逻辑测试)。任何逻辑移出到您在X实体中传递给的类。然后,您只需通过填充类并将其发送出去即可测试您的逻辑。

作为替代方案,请保持您的控制器操作非常轻量级,以免它需要测试。

同样在一个单独的说明,处置您的上下文类:使用

(VAR DB =新CamaDataContext()){ .. 返回查看(..) }

另外考虑如此处所示的[AutoMap()]属性,以使您的操作方法更加精简。

http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

我将在控制器这样将不需要测试内容的两个线路的方法。