2010-02-08 13 views
35

Ho bisogno di utilizzare alcuni componenti WPF in un test dell'unità NUnit. Corro la prova attraverso ReSharper, e viene a mancare con il seguente errore quando si utilizza l'oggetto WPF:Utilizzo dei componenti WPF nei test NUnit - come utilizzare STA?

System.InvalidOperationException:

Il thread chiamante deve essere STA, perché molti componenti dell'interfaccia utente richiedono.

Ho letto su questo problema e sembra che il thread debba essere STA, ma non ho ancora capito come farlo. Che cosa innesca il problema è il seguente codice:

[Test] 
public void MyTest() 
{ 
    var textBox = new TextBox(); 
    textBox.Text = "Some text"; // <-- This causes the exception. 
} 
+1

Questa non è una prova di unità. Inoltre, sei sicuro di volere che i test facciano affidamento sui componenti WPF? L'interfaccia utente dovrebbe essere separata dalla logica dell'applicazione per motivi come quelli sopra. – Finglas

+7

Bene - Sono consapevole che non c'è un test vero e proprio qui, e non è questo il mio test unitario. Tuttavia - questo è un codice sufficiente per mostrare il punto. Inoltre, il problema è legato al fatto che si tratta di un test dell'unità nNnit eseguito tramite ReSharper, quindi è necessario mantenere questo contesto per la domanda. Il tuo altro punto è valido anche se .. Non voglio che i miei test unitari facciano affidamento sui componenti WPF, ma per ora questa sembra essere la soluzione migliore. Vedremo se riesco a tirarlo fuori più tardi .. – stiank81

+0

Se vuoi vedere perché ho un'interfaccia utente nella logica dell'applicazione, vedi la mia altra domanda: http://stackoverflow.com/questions/2220842/modifying-ui-from- comandi-using-command-binding-in-wpf – stiank81

risposta

0

Hai provato this?


... semplicemente creare un file app.config per la DLL che si sta tentando di testare, e aggiungere alcune impostazioni appropriate NUnit per forzare NUnit per creare l'environemnt test come STA invece di MTA.

Per comodità, qui è il file di configurazione si avrebbe bisogno (o aggiungere queste sezioni per il file di configurazione esistente):

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
     <sectionGroup name="NUnit"> 
      <section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/> 
     </sectionGroup> 
    </configSections> 

    <NUnit> 
     <TestRunner> 
      <add key="ApartmentState" value="STA" /> 
     </TestRunner> 
    </NUnit> 
</configuration> 
+2

Thx! Ho appena trovato la stessa soluzione, e funziona. Apparentemente ReSharper usa una versione precedente di nUnit e quindi non posso semplicemente usare l'attributo [RequiresSTA]. – stiank81

+2

FYI, '[RequiresSTA]' funziona correttamente in VS 2013 con ReSharper 9 – cod3monk3y

+0

Se una particolare versione di ReSharper presenta un problema con RequiresSTA, allora perché ReSharper non ha semplicemente ignorato tale avviso? – bugged87

58

si dovrebbe aggiungere il RequiresSTA attribut alla classe di test.

[TestFixture, RequiresSTA] 
public class MyTestClass 
{ 
} 
+7

questa dovrebbe essere la risposta ... –

+1

Questo è solo per le versioni di NUnit sotto 3.0. È obsoleto> versione 3. –

18

Con le versioni più recenti, l'attributo è cambiato:

[Apartment(ApartmentState.STA)] 
public class MyTestClass 
{} 
+5

Questa è la risposta corrente con> versione 3 di NUnit. –

Problemi correlati