web-dev-qa-db-fra.com

Comment exécuter des tests unitaires en mode STAThread?

Je voudrais tester une application qui utilise le Presse-papiers (WindowsForms) et j'ai également besoin du Presse-papiers dans mes tests unitaires. Pour l'utiliser, il devrait fonctionner en mode STA, mais comme NUnit TestFixture n'a pas de méthode principale, je ne sais pas où/comment l'annoter.

52
Peter

Pour NUnit 2.2, 2.4 (Voir la solution simple ci-dessous pour 2.5):

Ajoutez un fichier app.config au projet contenant vos tests unitaires et incluez les éléments suivants:

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

Vous pouvez vérifier que le thread d'appartement est STA avec le code C # suivant:

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

Si vous utilisez nunit 2.5+, vous pouvez utiliser le nouveau The RequiresSTAAttribute at class

[TestFixture, RequiresSTA]

ou niveau d'assemblage.

[Assembly:RequiresSTA]

Pas besoin de fichier de configuration. vérifier: http://www.nunit.org/index.php?p=requiresSTA&r=2.5

100
mas_oz2k1

NUnit 3.

Nous avons récemment migré vers NUnit 3.0 et les anciens attributs que nous utilisions ne fonctionnaient plus. Nos tests ont utilisé un mélange de [STAThread] et [RequiresSTA] comme dans la réponse de mas_oz2k1 ci-dessus. STAThread donnait des erreurs de compilation car il n'était plus trouvé et RequiertSTA donnait des avertissements car il était obsolète.

Le New Deal semble utiliser les éléments suivants:

niveau d'assemblage

[Assembly: Apartment(ApartmentState.STA)]

Niveau de classe

[TestFixture]
[Apartment(ApartmentState.STA)]

Niveau de méthode

[Test]
[Apartment(ApartmentState.STA)]

Essayer de trouver ces informations m'a conduit sur une route sombre où les gens modifiaient leur code de test à l'aide d'une classe appelée CrossThreadTestRunner. C'était la solution en 2004, je suppose, avant la création de ces classes d'attributs.

56
JoelC

Dans NUnit 2.6.1+, vous pouvez utiliser l'indicateur de ligne de commande / apartment = STA:

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