2013-07-22 19 views
13

ho creato un test all'interno di un progetto di test Unità, in cui voglio apparire una modulo utilizzando la sua funzione di ShowDialog():form.ShowDialog() non viene visualizzata la finestra con il debug abilitato

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

    return; 
} 

I si aspetta che questo test raggiunga ShowDialog() ed esegua 'indefinitamente', fino a quando non chiudo la finestra. Tuttavia, quando eseguo questo test "con debug", il test raggiunge ShowDialog() e non viene visualizzato alcun modulo. Stranamente, questo stesso test funziona allo stesso modo se eseguo "senza debug".

Devo essere in grado di eseguire il test "con debug" e visualizzare la finestra.

Altre note:

  • Show() non è auspicabile, in quanto non aspettare la finestra per chiudere per continuare. (Inoltre ... non funziona.)
  • Questo stesso codice ha funzionato in precedenza su un altro progetto che utilizza .NET 3.5. Questo è solo per dire che la strategia ShowDialog() ha sicuramente funzionato prima. (E sì, ho copiato direttamente quel codice funzionante.)
  • La mia domanda è simile a this one, tuttavia, il mio modulo non è figlio di un'altra finestra di dialogo e non vive all'interno di un thread dell'interfaccia utente padre.

risposta

27

Per quanto cerco di evitare di unit test edificio che utilizzano System.Windows.Forms, mi sono imbattuto in un caso strano in cui ho bisogno di questo come bene e risolto gestendo l'evento Load e impostando in modo esplicito Visible = true. Ciò forza la forma a visibile quando viene chiamato ShowDialog dal metodo di test.

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

In alternativa, basta osservare l'istanza del modulo dal metodo di prova e fare lo stesso lì invece. Almeno questo mitiga ulteriormente il problema in quanto mantiene l'hack fuori dal codice del tuo form.

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

Ho avuto un raro caso di aver bisogno di questo e la tua risposta ha aiutato. Tuttavia mi sono reso conto che posso solo creare l'oggetto modulo nel test, quindi impostare myform.visible = true nel test. Funziona perfettamente :) – RosieC

+2

Il codice come David presentato ha funzionato bene per me su VS2013. Tuttavia su VS2015 ha smesso di mostrare il modulo. Grazie mille, il lambda mi ha aiutato. –

+0

Questo lo ha risolto per me su VS2017, dove questo è diventato un problema dopo un crash VS – Jens

Problemi correlati