2010-02-08 13 views
35

Necesito usar algunos componentes de WPF en una prueba de unidad NUnit. Funciono con la prueba a través de ReSharper, y se produce el siguiente error al utilizar el objeto de WPF:Uso de componentes WPF en pruebas NUnit: cómo usar STA?

System.InvalidOperationException:

El subproceso de llamada debe ser STA, debido a que muchos componentes de interfaz de usuario requieren.

He leído sobre este problema, y ​​parece que el hilo debe ser STA, pero todavía no he resuelto cómo hacerlo. Lo que desencadena el problema es el siguiente código:

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

Esto no es una prueba de la unidad. Además, ¿está seguro de que quiere que sus pruebas dependan de los componentes de WPF? La IU debe separarse de la lógica de la aplicación por razones como las anteriores. – Finglas

+7

Bueno, soy consciente de que no hay una prueba real aquí, y esta no es la prueba de mi unidad. Sin embargo, este es un código suficiente para mostrar el punto. Además, el problema está relacionado con el hecho de que se trata de una prueba de unidad nNnit ejecutada a través de ReSharper, por lo que debo mantener este contexto para la pregunta. Sin embargo, su otro punto es válido. No quiero que las pruebas de mi unidad dependan de los componentes de WPF, pero por ahora esta parece ser la mejor solución. Veré si puedo sacarlo de allí más tarde. – stiank81

+0

Si quiere ver por qué tengo UI en la lógica de la aplicación, vea mi otra pregunta: http://stackoverflow.com/questions/2220842/modifying-ui-from- commands-using-command-binding-in-wpf – stiank81

Respuesta

0

¿Ha intentado this?


... Basta con crear un archivo app.config para la DLL que está intentando probar, y añadir algunos ajustes apropiados NUnit para forzar NUnit para crear el environemnt prueba como STA en lugar de MTA.

Por razones de conveniencia, aquí es el archivo de configuración que se necesita (o añadir estas secciones para su archivo de configuración existente):

<?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! Acabo de encontrar la misma solución y funciona. Aparentemente, ReSharper usa una versión anterior de nUnit y, por lo tanto, no puedo usar simplemente el atributo [RequiresSTA]. – stiank81

+2

FYI, '[RequiresSTA]' funciona bien en VS 2013 con ReSharper 9 – cod3monk3y

+0

Si una versión particular de ReSharper tiene un problema con RequiresSTA, ¿por qué no simplemente hacer que ReSharper ignore esa advertencia? – bugged87

58

debe agregar el attribut RequiresSTA a su clase de prueba.

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

esta debería ser la respuesta ... –

+1

Esto es solo para versiones de NUnit por debajo de 3.0. Es obsoleto> versión 3. –

18

Con las versiones más recientes, el atributo ha cambiado:

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

Esta es la respuesta actual con> versión 3 de NUnit. –

Cuestiones relacionadas