2010-03-12 13 views
40

Ich möchte eine App testen, die die Zwischenablage (WindowsForms) verwendet und ich brauche die Zwischenablage auch in meinen Unit-Tests. Um es zu benutzen, sollte es im STA-Modus laufen, aber da das NUnit TestFixture keine Hauptmethode hat, weiß ich nicht, wo/wie man es annotieren soll.So führen Sie Komponententests im STAThread-Modus durch?

+0

Aus Neugier, wird es nicht ausreichen, das Attribut [STATThread] oben auf Ihrem TextFixture/TestMethod/TestClass hinzuzufügen? –

+0

Es funktioniert nur mit Methoden, und es funktionierte nicht bei Testaufbauten, Testmethoden, ... Natürlich hätte ich etw. Übersehen. Sie können gerne antworten, wenn Sie eine andere Lösung finden. – Peter

Antwort

30

Für NUnit 2.2, 2.4 (siehe unten einfache Lösung für 2.5):

eine app.config-Datei zum Projekt hinzufügen Unit-Tests enthalten und umfassen die folgenden:

<?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> 

Sie können überprüfen, dass die Wohnung Threading ist STA mit dem folgenden C# -Code:

if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA) 
{ 
    throw new ThreadStateException("The current threads apartment state is not STA"); 
} 
+6

Einfache, aber frustrierende Frage, sofort funktionierende Antwort: An manchen Tagen liebe ich SO. – Peter

+1

Fast vergessen: Danke Mann – Peter

+0

Wenn Sie jemals wieder suchen (und SO ist down) ist dies von der Beispielkonfiguration in WatiN zur Verfügung gestellt. Froh, dass ich helfen konnte. :) –

91

Wenn Sie nunit verwenden 2.5+, können Sie die neue die RequiresSTAAttribute bei Klasse verwenden können

[TestFixture, RequiresSTA] 

oder Baugruppenebene.

[assembly:RequiresSTA] 

Keine Notwendigkeit für die Konfigurationsdatei. Check: http://www.nunit.org/index.php?p=requiresSTA&r=2.5

+3

Dies ist das einzige, was mir bei Tests mit dem ReSharper 5.1 Test Runner von Visual Studio 2010 SP1 geholfen hat. –

+3

Danke, es hat für mich funktioniert! Besser als die angenommene Antwort. –

+5

Sie können 'RequiresSTA' auch für einzelne Testmethoden verwenden, und das BCL' STAThread'-Attribut funktioniert als ein Synonym für 'RequiresSTA'. –

3

In NUnit 2.6.1+ Sie die /Wohnung = STA Befehlszeile-Flag verwenden können:

NUnit-Console version 2.6.3.13283 
Copyright (C) 2002-2012 Charlie Poole. 
Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov. 
Copyright (C) 2000-2002 Philip Craig. 
All Rights Reserved. 

Runtime Environment - 
    OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1 
    CLR Version: 4.0.30319.18052 (Net 4.5) 


NUNIT-CONSOLE [inputfiles] [options] 

Runs a set of NUnit tests from the console. 

You may specify one or more assemblies or a single 
project file of type .nunit. 

Options: 
... 
/apartment=X   Apartment for running tests: MTA (Default), STA 
... 
28

NUnit 3,0

Wir wanderten in NUnit kürzlich 3.0 und die alten Attribute, die wir benutzt hatten, funktionierten nicht mehr. Unsere Tests verwendeten eine Mischung aus [STAThread] und [RequiresSTA] wie in mas_oz2k1s Antwort oben. STAThread gab Kompilierungsfehler seit es nicht mehr gefunden wurde und RequiresSTA gab Warnungen, weil es veraltet wurde.

Der New Deal erscheint die folgende using werden:

Baugruppenebene

[assembly: Apartment(ApartmentState.STA)] 

Klasse Level

[TestFixture] 
[Apartment(ApartmentState.STA)] 

Methode Stufe

Der Versuch, diese Informationen zu finden, brachte mich auf eine dunkle Straße, wo Leute ihren Testcode mit einer Klasse namens CrossThreadTestRunner modifizierten. Dies war die Lösung, die ich 2004 angenommen habe, bevor diese Attributklassen erstellt wurden.

+1

Dies ist die Antwort für NUnit 3.0+. Vergessen Sie nicht, 'System.Threading' einzubeziehen. – AutomatedChaos