2008-11-19 23 views
6

Şu anda form denetimleri, örneğin Metin Kutusu, Grup Kutusu gibi bazı temel işlemleri gerçekleştiren bazı yöntemler yazıyorum, bu işlemler geneldir ve herhangi bir uygulamada kullanılabilir.UI denetimlerini kullanan birim sınama yöntemi

Bazı birim sınamaları yazmaya başladım ve System.Windows.Forms dosyasındaki gerçek form denetimlerini kullanmamı veya yalnızca denemeye çalıştığım bölümleri almam gerektiğini merak ettim. Yani, örneğin:

 public static void clearall(this Control control) 
     { 
      if (control.GetType() == typeof(TextBox)) 
      { 
       ((TextBox)control).Clear(); 
      } 
     } 

Sonra ben bir şey yapmak bu yöntemi test etmek istiyorum:

Bir kontrolünü ele alır bu yöntemi var ve bir metin kutusu ise böyle bir metin özelliği temizleyecektir Say böyle:

 [TestMethod] 
     public void TestClear() 
     { 
      List<Control> listofcontrols = new List<Control>(); 
      TextBox textbox1 = new TextBox() {Text = "Hello World" }; 
      TextBox textbox2 = new TextBox() { Text = "Hello World" }; 
      TextBox textbox3 = new TextBox() { Text = "Hello World" }; 
      TextBox textbox4 = new TextBox() { Text = "Hello World" }; 

      listofcontrols.Add(textbox1); 
      listofcontrols.Add(textbox2); 
      listofcontrols.Add(textbox3); 
      listofcontrols.Add(textbox4); 

      foreach (Control control in listofcontrols) 
      { 
       control.clearall(); 
       Assert.AreEqual("", control.Text); 
      } 
     } 

benim birim testine System.Window.Forms bir referans ekleyecekse ve gerçek metin kutusu nesnesi kullanmalı mıyım? ya da yanlış mı yapıyorum?

NOT: Yukarıdaki kod yalnızca bir örnektir, derlemedim veya çalıştırmadım.

cevap

6

UI denetimleriyle etkileşimi simüle ederek uygulama mantığını birim sınaması yapmaya çalışıyorsanız, MVC pattern kullanarak bazı soyutlamalar yapmalısınız. Daha sonra bir saplama görünümüne sahip olabilirsiniz ve birim testlerinden kontrolör yöntemlerini çağırabilirsiniz.

Eğer birim sınaması yapmaya çalıştığınız gerçek denetimlerse, bana sahip olursunuz.

+0

, .NET Framework test gerçek kullanım yoktur. Microsoft bunu zaten oldukça büyük ölçüde yapıyor :). – Tigraine

3

Kodunuz System.Windows.Forms.Control'e dayanıyorsa, önerdiğiniz şey bile derlenmeyecektir. Denetim ve Textbox sürümünüz sadece yanlış tipte.

public interface ITextBox 
{ 
    public string Text {get; set;} 
} 

public class TextBoxAdapter : ITextBox 
{ 
    private readonly System.Windows.Forms.TextBox _textBox; 
    public TextBoxAdapter(System.Windows.Forms.TextBox textBox) 
    { 
     _textBox = textBox; 
    } 

    public string Text 
    { 
     get { return _textBox.Text; } 
     set { _textBox.Text = value; } 
    } 
} 

public class YourClass 
{ 
    private ITextBox _textBox; 
    public YourClass(ITextBox textBox) 
    { 
     _textBox = textBox; 
    } 

    public void DoSomething() 
    { 
     _textBox.Text = "twiddleMe"; 
    } 
} 

Ardından, test, yapmanız gereken tek şey bir yaratmaktır:, bunun yerine, arayüzler ile kullanıcı arayüzü ve Mantık ayrılmış ise

, o zaman böyle bu ... şey yapabileceğini sahte, sahte veya sapık ITextBox ve iletin.

Böyle bir şey yaptığımda, biraz daha yüksek bir düzeyde bir arabirim oluşturuyorum ... Tüm kullanıcı arabirimine çok benzeyen ve kullanıcı arabirimine benzeyen bir arabirim oluşturuyorum arayüzü uygular. Daha sonra, ihtiyaç duyduğum tüm kullanıcı arayüzünü, bunun bir Form kontrolü olduğunu bilmeden, ikiye bölebilirim. Eğer gerçek kontrolleri yaratma yaklaşımıyla gitmek isterseniz arada

, bu konuda bu blog yazısı düşünün: http://www.houseofbilz.com/archive/2008/10/12/winforms-automation-extensions.aspx

5

Model- Arayüzle mantıktan UI sunum ayırmak için yararlı birçok desenler vardır View-Controller ve Model-View-Presenter'ın çeşitli enkarnasyonları (AKA Humble Dialog). Humble Dialog, özellikle ünite testini kolaylaştırmak için tasarlanmıştır. Tasarım arsenalinizde mutlaka bu UI modellerinden birine sahip olmalısınız.

Ancak, basit biçimler için, çerçevenin bunu desteklediği zaman, doğrudan gerçek UI denetimlerine karşı test etmek oldukça kolay olduğunu buldum. Java Swing ve Windows.Forms'da tamamen test-ilk olarak oldukça sağlam UI'ler oluşturdum. SWT veya ASP.NET'te yönetemedim ve MVP'ye geri döndüm. Böyle test şeyler için

...

[Test] public void ShouldCopyFromAvailableToSelectedWhenAddButtonIsCLicked(){ 
    myForm.AvailableList.Items.Add("red"); 
    myForm.AvailableList.Items.Add("yellow"); 
    myForm.AvailableList.Items.Add("blue"); 

    myForm.AvailableList.SelectedIndex = 1; 
    myForm.AddButton.Click(); 

    Assert.That(myForm.AvaiableList.Items.Count, Is.EqualTo(2)); 
    Assert.That(myForm.SelectedList.Items[0], Is.EqualTo("yellow")); 
} 

...doğrudan UI kontrollerine karşı çalışıyor. Fare hareketlerini, tuş vuruşlarını veya sürükle ve bırak test başlamak istiyorum Ama eğer Brian önerdiği gibi daha sağlam bir UI desen seçme daha iyi olurdu.

Katılıyorum
İlgili konular