2013-07-22 20 views
13

Utworzyłem testu w ramach projektu badanej jednostki, w której chcę pop-up Formularza używając jego ShowDialog() funkcję:Form.ShowDialog() nie wyświetli okno z debugowanie włączone

[TestMethod] 
public void TestDialog() 
{ 
    // This class inherits from Form 
    TestForm serviceTestForm = new TestForm("My test form"); 
    serviceTestForm.ShowDialog(); 

    return; 
} 

I spodziewaj się, że ten test dotrze do ShowDialog() i uruchomi się "na czas nieokreślony", dopóki nie zamknę okna. Jednak po uruchomieniu tego testu "z debugowaniem" test dociera do ShowDialog() i nie pojawia się żadna forma. O dziwo, ten sam dokładny test działa, jeśli uruchomię "bez debugowania".

Muszę być w stanie uruchomić test "z debugowaniem" i wyświetlić okno.

Inne uwagi:

  • Show() nie jest pożądane, ponieważ nie czekać do okna, aby zamknąć, aby kontynuować. (Poza tym ... to nie działa.)
  • Ten sam kod pracował wcześniej w innym projekcie wykorzystującym .NET 3.5. To tylko, że strategia ShowDialog() na pewno zadziałała wcześniej. (I tak, skopiowałem ten działający kod bezpośrednio.)
  • Moje pytanie jest podobne do this one, jednak moja forma nie jest dzieckiem z innego okna dialogowego i nie jest w obrębie macierzystego wątku interfejsu użytkownika.

Odpowiedz

27

Aż Staram się unikać testów jednostkowych budynek używające System.Windows.Forms, wpadłem na nieparzystej przypadku, gdy potrzebowałem tego, jak dobrze i rozwiązać go obsługując zdarzenie Load i wyraźnie ustalone Visible = true. Zmusza to formę do widoczności, gdy wywoływana jest metoda ShowDialog z metody testowej.

private void form1_Load(object sender, EventArgs e) 
{ 
    // To support calling ShowDialog from test method... 
    this.Visible = true; 
    ... 
} 

Alternatywnie wystarczy obserwować formularz z metody testowej i zrobić to samo. Przynajmniej to zmniejsza problem w tym sensie, że zapobiega wyłudzaniu kodu z formularza.

var frm = new Form1(); 
frm.Load += (sender, e) => (sender as Form1).Visible = true; 
frm.ShowDialog(); 
+0

Miałem rzadki przypadek potrzeby, a Twoja odpowiedź pomogła. Jednak zdałem sobie sprawę, że mogę po prostu utworzyć obiekt formularza w teście, a następnie ustaw test myform.visible = true. Działa idealnie :) – RosieC

+2

Kod taki jak prezentowany David działał dobrze dla mnie na VS2013. Jednak na VS2015 przestał wyświetlać formularz. Dziękuję bardzo, pomógł lambda. –

+0

Naprawiono to dla mnie w VS2017, gdzie stało się to problemem po awarii VS – Jens

Powiązane problemy