2012-10-05 5 views
5

UI経由で呼び出されたときにコードは正常に動作しますが、単体テストで呼び出された場合は正常に動作しません。私は簡単なWinform Appのためにこれを再現することができました。ユニットテストで呼び出された場合、DataGridViewはDataSourceを受け入れません。

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オブジェクトに関連付けられた実際のオブジェクトと関連していますか?あなたが統合テストではなく、ユニットテストを実施しようとしているように

+0

どのように失敗しますか? –

+0

@AustinSalonen dataGridView1.Rows.Countは0です。これは2にする必要があります。 – Ankush

答えて

6

dataGridView1.BindingContext = new BindingContext();を追加すると、この作業ができます。この回答は役に立ちました。 Databinding a DataGridView control which is not in Form.Controls collection?

[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. 
} 
0

私はあなたが好き、データソースを設定しているあなたのWinFormAppでdataGridView1

のためのデータソースを設定している場所を確認していないになります。

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; 
    } 

単体テストは、テストが一点に集中するようにできるだけモックする必要がある環境要件が無効である必要があります。します。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); 

    } 
} 
+0

この質問は単体テストと統合テストについてではありません。それは、Windowsフォームのenvtを超えてインスタンス化されたときに動作しないDataGridViewについてです。上記のコードでは、あなたのテスト 'FormManagerTestSource'は合格ですか?それは私のために失敗している。 – Ankush

関連する問題