2010-06-10 70 views
0

我有下面的代码,它是在没有测试的情况下编写的,但实际上设计得非常好,并且松散耦合。 CachedBindingListView构造了一些对象,即页面提供者和缓存。 如下。对构造函数中创建的其他私有对象构成的重构代码的最佳做法

/// <summary> 
    /// Inner data cache 
    /// </summary> 
    private Cache<T> InnerCache { get; set; } 

    /// <summary> 
    /// Page provider 
    /// </summary> 
    private PageProvider<T> PageProvider { get; set; } 

    /// <summary> 
    /// the Request object that is built with a filter, sort, no of pages etc. 
    /// </summary> 
    private BindingListRequest<T> BindingListRequest { get; set; } 

    #endregion 

    #region Constructor 

    /// <summary> 
    /// New object 
    /// </summary> 
    /// <param name="bindingListRequest">Request for a particular set of Business Objects</param> 
    public CachedBindingListView(BindingListRequest<T> bindingListRequest) 
    { 
     BindingListRequest = bindingListRequest; 
     PageProvider = new PageProvider<T>(BindingListRequest); 
     InnerCache = new Cache<T>(PageProvider); 
    } 

我已经为BindingListRequest,PageProvider和InnerCache编写了测试。但现在想要开始为CachedBindingList编写测试。 构造函数当前使用BindingListRequest并基于此构造一个页面提供程序和内部缓存。

出于测试目的,我希望能够在TestDouble中为PageProvider和Cache提供。

这样做的最佳方法是什么? 我已考虑以下选项。

1)将PageProvider和InnerCache添加到构造函数中,并在需要时注入适当的类型。

2)使用DI框架解决CachedBindingListView构造函数中的PageProvider和Cache。这将涉及注入DI容器到CachedBindingListView构造函数或使其成为全局的。

3)创建一个工厂,该工厂创建PageProvider和Cache以及可能甚至是CachedBindingListView,并使用这个工厂在CachedBingingListView的构造函数中创建PageProvider和InnerCache。这将再次涉及到使全局工厂或将其注入到CachedBingingListView的构造函数中。

4)制作PageProvider和InnerCache属性公开并使用DI框架创建CachedBindingListView并通过属性注入注入PageProvider和InnerCache属性。因此,允许我重写在测试期间被注入的Cache和PageProvider。

我可以看到这些中的任何一个都可以工作,但所有这些都显得有些粗暴和强迫。 那里有什么意见。 任何人有什么建议的最佳方式做到这一点。

感谢 GD

回答

1

如果你只是希望能够对其进行测试 - 一种选择是做一个受保护的构造与注射这三种属性。然后在你的测试中做一个从CachedBindingListView继承的FakeCachedBindingListView并注入所需的存根,嘲讽(选择你的毒药)。

无论如何,这就是我想要的。

+0

嗨哥布林谢谢恩泽应该列出这是我的选择之一。 这也有点像我为了测试目的而修改我的产品代码,但绝对是一个不错的选择。 – GloryDev 2010-06-10 07:15:05

+0

确实如此 - 但无论如何你必然会改变你的产品代码 - 无论是DI/IoC。这是一个小的改变,不会影响生产代码的功能。好的一点是,如果你这样做,你可以通过公开新的构造函数来引入DI。 – Goblin 2010-06-10 07:27:31

+0

这是真的。我按照你的建议改变了课程,并开始为它编写测试,并且它工作得很好。 tks – GloryDev 2010-06-10 07:33:19

相关问题