我有下面的代码,它是在没有测试的情况下编写的,但实际上设计得非常好,并且松散耦合。 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
嗨哥布林谢谢恩泽应该列出这是我的选择之一。 这也有点像我为了测试目的而修改我的产品代码,但绝对是一个不错的选择。 – GloryDev 2010-06-10 07:15:05
确实如此 - 但无论如何你必然会改变你的产品代码 - 无论是DI/IoC。这是一个小的改变,不会影响生产代码的功能。好的一点是,如果你这样做,你可以通过公开新的构造函数来引入DI。 – Goblin 2010-06-10 07:27:31
这是真的。我按照你的建议改变了课程,并开始为它编写测试,并且它工作得很好。 tks – GloryDev 2010-06-10 07:33:19