2011-12-30 41 views
3

在我的单元测试中,我使用AssemblyInitialize,ClassInitializeTestInitialize等配置我的测试。在AssemblyInitialize中,我初始化了一些用于创建服务的单体工厂,一个工作单元和存储库(全部通过Unity/Dependency Injection)。在我的TestInitialize中,我清除了他们必须确保每个测试都可以独立运行的状态。何处移动构建一次性依赖关系以提高可测试性?

槽Stackoverflow我来到以下文章:Writing Testable CodeHow to Think About the “new” Operator with Respect to Unit Testing。我不得不说,他们改变了我对我写的一些代码的看法,但我的头脑仍然嗡嗡作响。

例如,采取以下代码:

public class MyPresenter : BasePresenter<IMyView> 
{ 
    public MyPresenter(IMyView view) 
     : base(view) 
    { 
    } 

    public void PrepareView() 
    { 
     using (IMyService service = ServiceFactory.Instance.CreateService<IMyService>()) 
     { 
      View.Data = service.GetData(); 
     } 
    } 
} 

这是一个aspx页面中使用这样的:

Presenter = new MyPresenter(this); 
if (!IsPostback) 
{ 
    presenter.PrepareView(); 
} 

我应该如何改变这种类型的一种充分考虑到以前的文章?我应该将服务实例传递给PrepareView方法吗?但是,然后我的ASPX页面必须知道服务和工厂和东西,并在使用后处理服务。

我应该怎样处理我的Singleton工厂?让它成为这个课程的一个属性,并通过Unity注入它?

回答

3

我发现这种类型的解析依赖不雅,看看Ninject连接依赖关系或注入它们的方式。

你可以看到区别,服务定位器是一个反模式,阅读这blog也使得更多的清除依赖注入的基本目的和做法,在.NET

+0

Ninject就像文章中提到的Guice一样?我会看看它。 – 2011-12-30 11:05:09

+1

是的,就是这样。 – 2011-12-30 11:05:49

-3

我看只有两种选择:

  1. 直接注射服务依存关系(但您提到不喜欢解决在ASPX级别的服务)
  2. 传中,主持人抽象DI容器,然后解决在演示的依赖(但您提到不喜欢这种方式,以及因为API会不清晰)

我宁愿第二个选项,让每一个主持人是知道哪些依赖它需要的,因为你正在使用DI容器(Uni ty)为什么不摆脱singleton工厂,只需在Unity中注册所有的工厂,这样你就可以在需要它的地方访问它,并且单元测试代码也没有任何问题(因为单体少)。 所以只是通过DI容器在各主持人(考虑您注意的是,不希望保持这一切,ASPX页面)作为第二个参数,然后解决所有必需的服务针对特定主持人:

class Presenter 
{ 
    public Presenter(IView, IDiContainerAbstraction container) 
    ... 
} 

Presenter = new MyPresenter(this, unityContainer); 
public void PrepareView()  
{ 
    using (IMyService service = this.unityContainer.Resolve<IMyService>()) 
    { 
     View.Data = service.GetData(); 
    } 
} 

所以:

  • 没有singletone的依赖,这使得单元测试可以
  • 由于通过接口抽象DI容器,你会在主持人模拟能P将同时进行单元测试
+0

那不是打破MVP模式,具有数据访问风景? – Magnus 2011-12-30 10:52:14

+0

如果该服务将被多个功能使用会怎样?我不喜欢在ASPX代码隐藏中获取这种代码的想法..然后,我的Web项目突然有一个WCF库的引用。然后,我们只是开发人员直接在服务上调用方法的一步(现在,我们使用体系结构验证来确保每个人都正确使用图层) – 2011-12-30 10:52:25

+0

我相信主持人访问数据('presenter.PrepareView()'方法) – sll 2011-12-30 10:53:25