2008-11-19 20 views
6

Hiện tại tôi đang viết một số phương thức thực hiện một số thao tác cơ bản trên các điều khiển biểu mẫu như Textbox, Groupbox, các hoạt động này là chung và có thể được sử dụng trong bất kỳ ứng dụng nào.Phương pháp thử đơn vị sử dụng các điều khiển UI

Tôi bắt đầu viết một số bài kiểm tra đơn vị và chỉ tự hỏi tôi nên sử dụng các điều khiển biểu mẫu thực có trong System.Windows.Forms hay tôi chỉ nên giả lập các phần mà tôi đang cố kiểm tra. Vì vậy, ví dụ:

Nói rằng tôi có phương pháp này mà phải mất một kiểm soát và nếu nó là một textbox nó sẽ xóa thuộc tính văn bản như thế này:

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

Sau đó, tôi muốn kiểm tra phương pháp này vì vậy tôi làm điều gì đó như thế này:

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

Tôi có nên thêm tham chiếu vào System.Window.Forms vào đơn vị của tôi và sử dụng đối tượng Hộp văn bản thực không? hay tôi làm sai?

LƯU Ý: Mã trên chỉ là một ví dụ, tôi không biên dịch hoặc chạy nó.

Trả lời

6

Nếu bạn đang cố gắng đơn vị kiểm tra logic ứng dụng bằng cách mô phỏng tương tác với các điều khiển giao diện người dùng, bạn nên làm một số trừu tượng bằng cách sử dụng MVC pattern. Sau đó, bạn chỉ có thể có một cái nhìn sơ khai và gọi các phương pháp điều khiển từ các bài kiểm tra đơn vị của bạn.

Nếu đó là các kiểm soát thực tế bạn đang thử nghiệm đơn vị, bạn đã có tôi.

+0

Tôi đồng ý, không có sử dụng thực tế trong việc kiểm tra Khuôn khổ .NET. Microsoft đã làm điều đó đến một mức độ khá lớn :). – Tigraine

3

Những gì bạn đang đề xuất thậm chí sẽ không biên dịch nếu mã của bạn dựa trên System.Windows.Forms.Control. Phiên bản Kiểm soát và Hộp văn bản của bạn chỉ đơn giản là loại sai.

Nếu, thay vào đó, bạn tách UI và logic của bạn với giao diện, sau đó bạn có thể làm điều này ... Một cái gì đó như thế này:

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

Sau đó, trong thử nghiệm của bạn, tất cả các bạn cần làm là tạo ra một giả lập, giả mạo hoặc sơ khai ITextBox và chuyển nó vào.

Khi tôi làm điều gì đó như thế này, tôi tạo giao diện ở mức cao hơn một chút ... Tôi tạo giao diện trông giống như toàn bộ giao diện người dùng và có giao diện người dùng triển khai giao diện. Sau đó, tôi có thể twiddle UI tất cả tôi cần, mà không bao giờ thực sự biết rằng nó là một hình thức kiểm soát.

Bằng cách này, nếu bạn muốn đi với cách tiếp cận của việc tạo ra các điều khiển thực tế, xem xét bài viết trên blog này về nó: http://www.houseofbilz.com/archive/2008/10/12/winforms-automation-extensions.aspx

5

Có một số mô hình mà có ích để tách trình bày UI từ logic UI bao gồm Model- View-Controller và các hóa thân khác nhau của Model-View-Presenter (AKA Humble Dialog). Humble Dialog được pha chế đặc biệt để làm cho việc kiểm tra đơn vị dễ dàng hơn. Bạn chắc chắn nên có một trong các mẫu giao diện người dùng này trong kho thiết kế của bạn.

Nhưng tôi đã thấy rằng đối với các biểu mẫu đơn giản, khi khung công tác hỗ trợ nó, nó khá đơn giản để kiểm tra trực tiếp với các điều khiển giao diện người dùng thực sự. Tôi đã xây dựng giao diện người dùng khá mạnh mẽ hoàn toàn kiểm tra đầu tiên trong Java Swing và Windows.Forms. Tôi không thể quản lý nó trong SWT hoặc ASP.NET và hoàn nguyên về MVP.

Để thử nghiệm những thứ như thế này ...

[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")); 
} 

...làm việc trực tiếp với các điều khiển UI hoạt động tốt. Nhưng nếu bạn muốn bắt đầu thử nghiệm di chuyển chuột, tổ hợp phím hoặc kéo và thả, bạn nên chọn một mẫu giao diện người dùng mạnh mẽ hơn như mô hình được đề xuất bởi Brian.

Các vấn đề liên quan