62 Stimmen

Wie führt man Unit-Tests im STAThread-Modus aus?

Ich möchte eine Anwendung testen, die die Zwischenablage verwendet (WindowsForms) und ich brauche die Zwischenablage auch in meinen Unit-Tests. Um es zu verwenden, sollte es im STA-Modus laufen, aber da die NUnit TestFixture keine Hauptmethode hat, weiß ich nicht, wo/wie ich sie annotieren soll.

105voto

mas_oz2k1 Punkte 2821

Wenn Sie nunit 2.5+ verwenden, können Sie die neue Funktion The RequiresSTAAttribute im Unterricht

[TestFixture, RequiresSTA]

oder Baugruppenebene.

[assembly:RequiresSTA]

Keine Konfigurationsdatei erforderlich. check: http://www.nunit.org/index.php?p=requiresSTA&r=2.5

90voto

JoelC Punkte 3332

NUnit 3.0

Wir haben vor kurzem auf NUnit 3.0 migriert und die alten Attribute, die wir verwendet hatten, funktionierten nicht mehr. Unsere Tests verwendeten eine Mischung aus [STAThread] y [RequiresSTA] wie in der obigen Antwort von mas_oz2k1. STAThread gab Kompilierfehler, da es nicht mehr gefunden wurde, und RequiresSTA gab Warnungen aus, da es veraltet ist.

Der New Deal scheint Folgendes zu nutzen:

Montageebene

[assembly: Apartment(ApartmentState.STA)]

Klassenstufe

[TestFixture]
[Apartment(ApartmentState.STA)]

Methode Ebene

[Test]
[Apartment(ApartmentState.STA)]

Der Versuch, diese Informationen zu finden, führte mich auf einen dunklen Pfad, auf dem Leute ihren Testcode mit einer Klasse namens CrossThreadTestRunner modifizierten. Ich nehme an, dass dies die Lösung aus dem Jahr 2004 war, bevor diese Attributklassen erstellt wurden.

35voto

Bernhard Hofmann Punkte 10053

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

Fügen Sie dem Projekt, das Ihre Unit-Tests enthält, eine app.config-Datei hinzu und fügen Sie Folgendes hinzu:

<?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 mit dem folgenden C#-Code überprüfen, ob das Apartment-Threading STA ist:

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

4voto

Denis Punkte 11330

In NUnit 2.6.1+ können Sie die /apartment=STA Befehlszeilenflag:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X