我的TDD实践:可测试性驱动开发(下)

发表于:2009-11-26 16:09

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:老赵点滴    来源:51Testing软件测试网采编

  没错,我们想要独立测试Build方法,但是现在SearchCriteriaBinder还不允许我们这么做。那么,继续重构吧:

internal interface ISearchCriteriaBuilder
{
    SearchCriteria Build(List<string[]> tokenGroups);
}

internal class SearchCriteriaBuilder : ISearchCriteriaBuilder
{
    internal SearchCriteriaBuilder() : this(GetConverter) { }

    internal SearchCriteriaBuilder(Func<string, IConverter> converterGetter)
    {
        this.m_getConverter = converterGetter;
    }

    internal static IConverter GetConverter(string field)
    {
        // 使用if ... else或是字典
    }

    private readonly Func<string, IConverter> m_getConverter;

    public SearchCriteria Build(List<string[]> tokenGroups)
    {
        ...
    }
}

  把Build的逻辑独立提取成类之后,自然需要让SearchCriteriaBinder使用SearchCriteriaBuilder:

public class SearchCriteriaBinder : IModelBinder
{
    public SearchCriteriaBinder()
        : this(new Tokenizer(), new SearchCriteriaBuilder()) { }

    internal SearchCriteriaBinder(ITokenizer tokenizer, ISearchCriteriaBuilder builder)
    {
        this.m_tokenizer = tokenizer; this.m_builder = builder;
    }

    private readonly ITokenizer m_tokenizer;
    private readonly ISearchCriteriaBuilder m_builder;

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var modelName = bindingContext.ModelName;
        var rawValue = bindingContext.ValueProvider[modelName].RawValue;

        var text = HttpUtility.UrlDecode(rawValue.ToString());
        var tokenGroups = this.m_tokenizer.Tokenize(text);

        return this.m_builder.Build(tokenGroups);
    }
}

54/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号