单元测试内部列表<string> </string>

时间:2012-06-12 18:20:34

标签: c# unit-testing

using System;
using System.Collections.Generic;
using System.Text;

[Serializable]
public class ColumnDataField
{
    #region Fields

    private int _columnIndex;
    private string _dataFields;

    #endregion Fields

    #region Properties

    /// <summary>
    /// Column index
    /// </summary>
    public int ColumnIndex
    {
        get { return _columnIndex; }
        set { _columnIndex = value; }
    }

    /// <summary>
    /// Data fields
    /// </summary>
    public string DataFields
    {
        get { return _dataFields; }
        set { _dataFields = value; }
    }

    /// <summary>
    /// Convert DataFields string to data field list
    /// </summary>
    internal List<String> DataFieldList
    {
        get
        {
            if (string.IsNullOrWhiteSpace(DataFields)) return new List<String>();

            string[] _array = DataFields.Split(new Char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

            List<String> _fields = new List<String>(_array);

            for (int _i = _fields.Count - 1; _i >= 0; _i--)
            {
                _fields[_i] = _fields[_i].Trim();
                if (string.IsNullOrWhiteSpace(_fields[_i])) _fields.RemoveAt(_i);
            }

            return _fields;
        }

        set
        {
            StringBuilder _buffer = new StringBuilder();

            foreach (string _field in value)
            {
                if (_buffer.Length > 0) _buffer.Append(",");
                _buffer.Append(_field);
            }

            DataFields = _buffer.ToString();
        }
    }

    #endregion Properties
}

}

我是C#的实习单元,所以对我很轻松。

我的其他项目没有太多问题,但我似乎无法弄清楚我是如何对内部列表进行单元测试的。

这是我目前为单元测试所用的代码:

    [TestMethod]
    public void DataFields_Test()
    {
        ColumnDataField questionText = new ColumnDataField();
        questionText.DataFields = "test";
        string expected = "test";
        string actual = questionText.DataFields;
        Assert.AreEqual(expected, actual);
    }      

因此,它将运行DataFields属性,但除此之外,它不会覆盖任何其他代码。我一直在网上搜索几天试图找出最好的方法来解决这个问题。我不需要被告知确切的做什么,但我会非常感谢指导。

1 个答案:

答案 0 :(得分:4)

选项#0:向老板咨询他们希望如何测试内部方法。

选项#1:将InternalsVisibleTo添加到测试中的程序集并直接调用DataFieldList

[assembly:InternalsVisibleTo("YourTestAssemblyName")]

选项#2:测试调用内部属性的东西,以便访问结果。

选项#3:不要测试内部属性/字段/方法/类/等。

我确信还有更多选择......

选项#可能不应该:您可以使用反射“找到”内部属性​​,但您可能不应该这样做。


另外,您可以大大简化未经测试的属性中的代码:

//.Net 4
get
{
    var cleansed = DataFields.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                             .Select(df => df.Trim())
                             .Where(str => !string.IsNullOrWhitespace(str));
    return new List<string>(cleansed);
}
set
{
    DataFields = string.Join(",", value);
}