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

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

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

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

  于是,我为List<string>到特定对象的转换操作也定义一个抽象:

public interface IConverter
{
    object Convert(List<string> values);
}

public class KeywordConverter : IConverter
{
    public object Convert(List<string> values)
    {
        return values[0];
    }
}

public class PriceRangeConverter : IConverter
{
    public object Convert(List<string> values)
    {
        return new PriceRange
       
{
            Min = float.Parse(values[0]),
            Max = float.Parse(values[1]) }; }}

public class ColorConverter : IConverter
{
    ...
}

  在这里,我为每个字段定义了一种转化器(而在实际开发过程中,我们可能也会为“每种类型”定义一个)。每个转化器对象均可独立的进行单元测试,其中复杂的边界条件,错误判断等等都是测试的目标。待几种转换器测试完毕,我们便可以重构SerachCriteriaBinder的Build方法:

private SearchCriteria Build(List<string[]> tokenGroups)
{
    var fieldTokens = tokenGroups.ToDictionary(
        g => g[0].ToLowerInvariant(),
        g => g.Skip(1).ToList());

    var searchCriteria = new SearchCriteria();

    List<string> values;
    if (fieldTokens.TryGetValue("keywords", out values))
    {
        searchCriteria.Keywords = (string)this.GetConverter("keywords").Convert(values);
    }

    if (fieldTokens.TryGetValue("price", out values))
    {
        searchCriteria.Price = (PriceRange)this.GetConverter("price").Convert(values);
    }

    if (fieldTokens.TryGetValue("color", out values))
    {
        searchCriteria.Colors = (Color)this.GetConverter("color").Convert(values);
    }

    return searchCriteria;
}

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

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号