2012-10-05 27 views
5

El código funciona bien cuando se invoca a través de la interfaz de usuario, pero no funciona cuando se llama a través de la prueba de la unidad. Pude reproducir esto para la sencilla aplicación Winform.DataGridView no acepta DataSource cuando se invoca a través de la prueba Unit

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

código de prueba Unidad

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

siguiente código se genera por el diseñador

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

} 

Mi conjetura es que me falta algún tipo de llamada init en el objeto DataGridView1 en unidad de recorrido del código de prueba . Pero usar el código generado por el diseñador en la prueba de unidad no ayudó. Tiene esto que ver con el objeto real asociado con un objeto Form?

+0

¿Cómo funciona? –

+0

@AustinSalonen dataGridView1.Rows.Count es 0. Debe ser 2. – Ankush

Respuesta

6

Añadiendo dataGridView1.BindingContext = new BindingContext(); hace esto trabajo. Esta respuesta ayudó. 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

parece que está tratando de poner en práctica las pruebas de integración en lugar de la unidad de pruebas

no veo donde va a configurar el origen de datos para el DataGridView1

en su WinFormApp va a configurar el origen de datos como:

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

Las pruebas de la unidad no deben cumplir con los requisitos del entorno. Deberá burlarse tanto como sea posible para que la prueba se centre en un punto. Look en: https: //nuget.org/packages/Moq/4.0.10827

crear una prueba independiente para cada componente o unidad

Veo que está tratando de verificar el número de filas

Prueba:

[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

Esta pregunta no se trata de pruebas unitarias vs pruebas de integración. Se trata de que DataGridView no funciona cuando se crea una instancia más allá de la forma de Windows envt. En el código anterior, ¿pasa su prueba 'FormManagerTestSource'? Está fallando para mí. – Ankush

Cuestiones relacionadas