2010-03-12 12 views
40

Me gustaría probar una aplicación que usa el Portapapeles (WindowsForms) y también necesito el Portapapeles en las pruebas de mi unidad. Para usarlo, debe ejecutarse en modo STA, pero dado que el NUnit TestFixture no tiene un método principal, no sé dónde ni cómo anotarlo.¿Cómo se ejecutan las pruebas unitarias en modo STAThread?

+0

Por curiosidad, ¿no será suficiente agregar el atributo [STATThread] sobre su TextFixture/TestMethod/TestClass? –

+0

Solo funciona en Métodos, y no funcionó en configuraciones de dispositivos, métodos de prueba, ... Por supuesto que podría haber pasado por alto algo. Le invitamos a responder si encuentra alguna otra solución. – Peter

Respuesta

30

Para NUnit 2.2, 2.4 (Ver solución simple a continuación para 2.5):

añadir un archivo app.config al proyecto que contiene las pruebas unitarias e incluyen los siguientes:

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

Puede verificar que el roscado apartamento es STA con el siguiente código C#:

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

Pregunta simple, pero frustrante, respuesta inmediata de trabajo: algunos días me encanta SO. – Peter

+1

Casi olvidando: Gracias hombre – Peter

+0

Si alguna vez lo buscas de nuevo (y SO está fuera de servicio) esto es de la configuración de muestra proporcionada en WatiN. Me alegro de poder ayudar. :) –

91

Si está utilizando nunit 2.5+, puede utilizar la nueva clase en el RequiresSTAAttribute

[TestFixture, RequiresSTA] 

o nivel de montaje.

[assembly:RequiresSTA] 

No hay necesidad de archivo de configuración. comprobar: http://www.nunit.org/index.php?p=requiresSTA&r=2.5

+3

Esto es lo único que funcionó para mí al intentar ejecutar pruebas utilizando el corrector de prueba de ReSharper 5.1 de Visual Studio 2010 SP1. –

+3

¡Gracias, funcionó para mí! Mejor que la respuesta aceptada. –

+5

También puede usar 'RequiresSTA' en métodos de prueba individuales, y el atributo BCL' STAThread' funciona como sinónimo de 'RequiresSTA'. –

3

En NUnit 2.6.1+ puede utilizar el /apartamento STA = mando de indicadores de línea:

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

Migramos a NUnit 3.0 recientemente y los viejos atributos que habíamos estado usando ya no funcionaban. Nuestras pruebas usaron una mezcla de [STAThread] y [RequiresSTA] como en la respuesta de mas_oz2k1 anterior. STAThread estaba dando errores de compilación ya que ya no se encontraba y RequiresSTA estaba dando advertencias porque ha quedado obsoleto.

El New Deal parece estar utilizando la siguiente:

Asamblea Nivel

[assembly: Apartment(ApartmentState.STA)] 

Nivel Clase

[TestFixture] 
[Apartment(ApartmentState.STA)] 

Método Nivel

[Test] 
[Apartment(ApartmentState.STA)] 

Tratando de encontrar esta información me llevó por un camino oscuro donde la gente estaba modificando su código de prueba usando una clase llamada CrossThreadTestRunner. Esta fue la solución en 2004, supongo, antes de que se crearan estas clases de atributos.

+1

Esta es _la_ respuesta para NUnit 3.0+. No te olvides de incluir 'System.Threading'. – AutomatedChaos

Cuestiones relacionadas