2016-11-01 8 views
1

У меня есть проект WinForms с шаблоном MVP (пассивный просмотр).Узел тестирования динамически заполняемого пользовательского элемента управления в WinForms

Я думаю, что у меня есть проблемы с рисунком, когда дело доходит до пользовательского элемента управления, который я разобрался во время модульного тестирования

У меня есть пользовательский элемент управления, который я положил на моей форме в результате события выстрелил в мой взгляд. Этот пользовательский элемент управления добавляет определенное количество меток, текстовых полей и т. Д. К себе на основе числа, которое оно получает от представления. Наконец, он сообщает виду добавить пользовательский элемент управления в представление.

Я хочу, чтобы подразделение тестировало логику в этом классе, так как это то, что я считаю самым важным для тестирования. Я просто не знаю, как это сделать, поскольку в этом классе есть как логика, так и форма управления. В настоящее время я использую Moq для создания модульных тестов.

Обычно я создавал объект Mock для представления представления, а затем тестировал реализацию методов в тестируемом объекте изолированно. Однако, поскольку я создаю элементы управления в этом классе, я не думаю, что смогу проверить это так (без включения библиотеки .Forms).

Я надеюсь, что кто-то знает решение.

EDIT: Я пытался отделить свою логику от манипуляций с управлением, но я борюсь с функцией из другого пользовательского элемента управления, который я разместил под исходным кодом пользовательского управления. Поскольку я просматриваю список элементов управления, я не знаю, как разделить это на просто логику и просто управлять обработкой.

Пользовательский контроль кода

public partial class DetailScreenUserControl : UserControl 
{ 
    // Private members. 
    private readonly IDetailScreenView _view; 
    private List<ComboBox> maturityInput = new List<ComboBox>(); 
    private List<ComboBox> complianceInput = new List<ComboBox>(); 

    // Public members. 
    public List<string> MaturityInput 
    { 
     get 
     { 
      var list = new List<string>(); 
      for (int i = 0; i < maturityInput.Count; i++) 
      { 
       list.Add(maturityInput[i].Text); 
      } 
      return list; 
     } 
     set 
     { 
      for (int i = 0; i < maturityInput.Count; i++) 
      { 
       maturityInput[i].DataSource = new List<string>(value); 
      } 
     } 
    } 
    public List<string> ComplianceInput 
    { 
     get 
     { 
      var list = new List<string>(); 
      for (int i = 0; i < complianceInput.Count; i++) 
      { 
       list.Add(complianceInput[i].Text); 
      } 
      return list; 
     } 
     set 
     { 
      for (int i = 0; i < complianceInput.Count; i++) 
      { 
       complianceInput[i].DataSource = new List<string>(value); 
      } 
     } 
    } 

    // Initialize user control with IDetailScreenView. Subscribe to necessary events. 
    public DetailScreenUserControl(IDetailScreenView view) 
    { 
     InitializeComponent(); 
     _view = view; 
     _view.InitializingUserControl += InitializeUserControl; 
    } 

    // Initializes the user control for the detail screen. 
    public void InitializeUserControl(object sender, EventArgs e) 
    { 
     List<string> qStandards = _view.SelectedQuestionStandards; 
     Controls.Clear(); 
     maturityInput.Clear(); 
     complianceInput.Clear(); 

     int inputSeparation = Height/2; 
     int spacing = Width/20; 

     Size = new Size(_view.RightUserControlBoundary - Location.X, Size.Height); 

     for (int i = 0; i < qStandards.Count; i++) 
     { 
      Panel inputPanel = new Panel(); 
      inputPanel.BackColor = Color.AliceBlue; 
      inputPanel.Location = new Point(0, i * inputSeparation); 
      inputPanel.Size = new Size(Width - spacing, inputSeparation); 
      Controls.Add(inputPanel); 

      Label qs_label = new Label(); 
      qs_label.AutoSize = true; 
      qs_label.Location = new Point(0, 0); 
      qs_label.Font = new Font("Arial", 12F, FontStyle.Bold); 
      qs_label.AutoSize = true; 
      qs_label.Text = qStandards[i].ToString(); 
      inputPanel.Controls.Add(qs_label); 

      Label m_label = new Label(); 
      m_label.AutoSize = true; 
      m_label.Location = new Point(0, qs_label.Bounds.Bottom + qs_label.Height/2); 
      m_label.Font = new Font("Arial", 12F, FontStyle.Regular); 
      m_label.Text = "Maturity standard"; 
      inputPanel.Controls.Add(m_label); 

      Label c_label = new Label(); 
      c_label.AutoSize = true; 
      c_label.Location = new Point(0, m_label.Bounds.Bottom + qs_label.Height/2); 
      c_label.Font = new Font("Arial", 12F, FontStyle.Regular); 
      c_label.Text = "Compliance standard"; 
      inputPanel.Controls.Add(c_label); 

      ComboBox m_input = new ComboBox(); 
      m_input.AutoSize = true; 
      m_input.Location = new Point(c_label.Bounds.Right + 2 * spacing, m_label.Bounds.Top); 
      m_input.Font = new Font("Arial", 10F, FontStyle.Regular); 
      m_input.DropDownStyle = ComboBoxStyle.DropDownList; 
      m_input.Size = new Size(inputPanel.Size.Width - m_input.Bounds.Left, spacing); 
      maturityInput.Add(m_input); 
      inputPanel.Controls.Add(m_input); 

      ComboBox c_input = new ComboBox(); 
      c_input.AutoSize = true; 
      c_input.Location = new Point(c_label.Bounds.Right + 2 * spacing, c_label.Bounds.Top); 
      c_input.Font = new Font("Arial", 10F, FontStyle.Regular); 
      c_input.DropDownStyle = ComboBoxStyle.DropDownList; 
      c_input.Size = new Size(inputPanel.Size.Width - c_input.Bounds.Left, spacing); 
      complianceInput.Add(c_input); 
      inputPanel.Controls.Add(c_input); 

     } 

     if(qStandards.Count != 0) 
     { 
      saveAssessmentButton.BackColor = System.Drawing.SystemColors.ButtonHighlight; 
      Controls.Add(saveAssessmentButton); 
      saveAssessmentButton.Location = new Point(this.Size.Width - saveAssessmentButton.Width - spacing, qStandards.Count * inputSeparation); 
     } 

     _view.AddUserControl(); 
    } 

    // Tells the view to save the assessment. 
    private void saveAssessmentButton_Click(object sender, EventArgs e) 
    { 
     _view.SaveAssessmentButtonClicked(); 
    } 
} 

Другие функции управления пользователем ('ответов' список управления)

public void SaveResults() 
{ 
    results = new List<string>(); 
    int questionNr = 0; 

    for (int p = 0; p < questions.Count; p++) 
    { 
     for (int i = 0; i < questions[p].Count; i++) 
     { 
      bool unanswered = true; 

      results.Add(questions[p][i]); 

      for (int j = 1; j <= maturityAnswers[p].Count; j++) 
      { 
       var radioButton = (RadioButton)answers[questionNr][j]; 
       if (radioButton.Checked) 
       { 
        results.Add(answers[questionNr][j].Text); 
        unanswered = false; 
       } 
      } 
      if (unanswered == true) 
      { 
       results.Add(""); 
      } 
      unanswered = true; 

      for (int j = maturityAnswers[p].Count + 1; j <= (maturityAnswers[p].Count + complianceAnswers[p].Count); j++) 
      { 
       var radioButton = (RadioButton)answers[questionNr][j]; 
       if (radioButton.Checked) 
       { 
        results.Add(answers[questionNr][j].Text); 
        unanswered = false; 
       } 
      } 
      if (unanswered == true) 
      { 
       results.Add(""); 
      } 

      results.Add(answers[questionNr][0].Text.Replace("'", "''")); 

      questionNr++; 
     } 
    } 

ответ

0

Я хочу модульного тестирования логики в этом класс, так как это то, что я думаю, что самое важное для тестирования. Я просто не знаю, как это сделать, , поскольку существует как логика и формы управления в этом классе

Так разделите их к различным классам и протестировать класс, который содержит только логику

+0

Ха-ха да что кажется логической задачей, не так ли, p. Просто это будет довольно сложно, так как манипуляции с управлением и логика настолько переплетаются, но я отдам это. У меня просто была эта идея в голове, что пользовательский элемент управления может содержать свою собственную логику без отдельного класса, но, я думаю, это было недоразумением от моего имени. –