2
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 プロパティが実行されますが、それ以外のコードは実行されません。私はこれを行うための最良の方法を見つけようとして、何日もオンラインで検索してきました. 何をすべきかを正確に伝える必要はありませんが、ガイダンスをいただければ幸いです。

4

1 に答える 1

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);
}
于 2012-06-12T18:30:10.933 に答える