2012-10-05 10 views
5

Kod działa poprawnie po wywołaniu za pośrednictwem interfejsu użytkownika, ale nie działa po wywołaniu za pomocą testu jednostkowego. Udało mi się to zaadresować dla prostej aplikacji Winform.DataGridView nie przyjmuje źródła danych po wywołaniu za pomocą testu jednostkowego

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

kod testów jednostkowych

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

następujący kod został wygenerowany przez projektanta

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

} 

Domyślam się, że jestem brakuje jakiegoś połączenia inicjacje Włącz obiektu dataGridView1 w ścieżce kodu testów jednostkowych . Ale używanie generowanego przez projektanta kodu w teście jednostkowym nie pomogło. Czy ma to związek z rzeczywistym obiektem powiązanym z obiektem Form?

+0

Jak to się nie udaje? –

+0

@AustinSalonen dataGridView1.Rows.Count ma wartość 0. Powinno być 2. – Ankush

Odpowiedz

6

Dodanie dataGridView1.BindingContext = new BindingContext(); sprawia, że ​​to działa. Ta odpowiedź pomogła. 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

wygląda staramy się wdrożyć testowanie integracji zamiast testów jednostkowych

nie widzę gdzie ustawiasz źródło danych dla dataGridView1

w swojej WinFormApp ustawiasz źródło danych jak:

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

Testy jednostkowe powinny być pozbawione wymagań środowiskowych, powinieneś kpić tak bardzo, jak to możliwe, aby Twój test skupił się na jednym punkcie. Spójrz na: https: //nuget.org/packages/Moq/4.0.10827

Utwórz osobny test dla każdego składnika lub jednostki

widzę próbujesz zweryfikować liczyć wiersz

spróbuj:

[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

To pytanie nie dotyczy testu jednostkowego w stosunku do testu integracji. Chodzi o to, że DataGridView nie działa, gdy instancja jest tworzona poza oknami. Czy w powyższym kodzie spełniony jest test "FormManagerTestSource"? To zawodzi dla mnie. – Ankush

Powiązane problemy