7

このコードは、UIを介して呼び出された場合は正常に機能しますが、単体テストを介して呼び出された場合は機能しません。単純なWinformアプリでこれを再現することができました。

namespace WinFormApp
{
    public class Pair
    {
        public string Key { get; set; }
        public string Value { get; set; }
    }

    public class FormManager
    {
        List<Pair> _source = new List<Pair>()
        {
            new Pair() { Key="1", Value = "one" },
            new Pair() { Key = "2", Value = "two" }
        };

        public FormManager(DataGridView dgv)
        {
            dgv.DataSource = _source;
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            FormManager manager = new FormManager(dataGridView1); // This works
        }
    }
}

ユニットテストコード

namespace WinFormApp.Test
{
    [TestClass()]
    public class FormManagerTest
    {
        private DataGridView dataGridView1;

        [TestMethod()]
        public void FormManagerTestSource()
        {
            this.dataGridView1 = new System.Windows.Forms.DataGridView();

            FormManager target = new FormManager(dataGridView1);

            Assert.AreEqual(2, dataGridView1.Rows.Count); // This fails.
        }
    }
}

次のコードはデザイナーによって生成されました

private void InitializeComponent()
{
    this.dataGridView1 = new System.Windows.Forms.DataGridView();
    ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
    this.SuspendLayout();
    // 
    // dataGridView1
    // 
    this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
    this.dataGridView1.Location = new System.Drawing.Point(20, 27);
    this.dataGridView1.Name = "dataGridView1";
    this.dataGridView1.Size = new System.Drawing.Size(240, 150);
    this.dataGridView1.TabIndex = 0;
    // 
    // Form1
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(284, 262);
    this.Controls.Add(this.dataGridView1);
    this.Name = "Form1";
    this.Text = "Form1";
    ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
    this.ResumeLayout(false);

}

私の推測では、ユニットテストコードパスのdataGridView1オブジェクトに対するある種のinit呼び出しが欠落しています。しかし、単体テストでデザイナーが生成したコードを使用しても役に立ちませんでした。これは、オブジェクトに関連付けられている実際のオブジェクトと関係がありFormますか?

4

2 に答える 2

9

追加dataGridView1.BindingContext = new BindingContext();すると、これが機能します。この答えは役に立ちました。 Form.ControlsコレクションにないDataGridViewコントロールのデータバインディング?

[TestMethod()]
public void FormManagerTestSource()
{
    this.dataGridView1 = new System.Windows.Forms.DataGridView();
    FormManager target = new FormManager(dataGridView1);
    Assert.AreEqual(0, dataGridView1.Rows.Count); // 0 initially.
    dataGridView1.BindingContext = new BindingContext(); // this makes it work.
    Assert.AreEqual(2, dataGridView1.Rows.Count); // 2 as expected.
}
于 2012-10-08T09:02:42.977 に答える
0

単体テストではなく統合テストを実装しようとしているようです

dataGridView1のデータソースをどこに設定しているかわかりません

WinFormAppでは、次のようにデータソースを設定しています。

 List<Pair> _source = new List<Pair>()
    {
        new Pair() { Key="1", Value = "one" },
        new Pair() { Key = "2", Value = "two" }
    };

    public FormManager(DataGridView dgv)
    {
        dgv.DataSource = _source;
    }

単体テストでは、テストが1つのポイントに集中するように、可能な限りモックする必要がある環境要件を排除する必要があります。見てください:https://nuget.org/packages/Moq/4.0.10827

コンポーネントまたはユニットごとに個別のテストを作成します

行数を確認しようとしているようです

試す:

 [TestClass()]
public class FormManagerTest
{


    [TestMethod()]
    public void FormManagerTestSource()
    {
        var dgv = new System.Windows.Forms.DataGridView();
        var _source = new List<Pair>()
    {
        new Pair() { Key="1", Value = "one" },
        new Pair() { Key = "2", Value = "two" }
    };
        Assert.AreEqual(2, _source.Count); 
        //If you want to test dgv row count
        dgv.DataSource = _source;
        Assert.AreEqual(2, dataGridView1.Rows.Count);

    }
}
于 2012-10-05T15:48:15.423 に答える