Как запустить модульные тесты в режиме STAThread? - PullRequest
50 голосов
/ 12 марта 2010

Я хотел бы протестировать приложение, которое использует буфер обмена (WindowsForms), и мне также нужен буфер обмена в моих модульных тестах. Чтобы использовать его, он должен работать в режиме STA, но поскольку в NUnit TestFixture нет метода main, я не знаю, где и как его аннотировать.

Ответы [ 4 ]

100 голосов
/ 14 марта 2011

Если вы используете nunit 2.5+, вы можете использовать новый RequiresSTAAttribute в классе

[TestFixture, RequiresSTA]

или уровень сборки.

[assembly:RequiresSTA]

Нет необходимости в конфигурационном файле. проверять: http://www.nunit.org/index.php?p=requiresSTA&r=2.5

54 голосов
/ 23 февраля 2016

NUnit 3.0

Мы недавно перешли на NUnit 3.0, и старые атрибуты, которые мы использовали, больше не работали. Наши тесты использовали смесь [STAThread] и [RequiresSTA], как в ответе mas_oz2k1 выше. STAThread выдавал ошибки компиляции, поскольку он больше не был найден, а RequSTSTA выдавал предупреждения, поскольку он устарел.

Новый курс, похоже, использует следующее:

Уровень сборки

[assembly: Apartment(ApartmentState.STA)]

Уровень класса

[TestFixture]
[Apartment(ApartmentState.STA)]

Уровень метода

[Test]
[Apartment(ApartmentState.STA)]

Попытка найти эту информацию привела меня к мрачному пути, когда люди модифицировали свой тестовый код с помощью класса CrossThreadTestRunner. Это было решением в 2004 году, я полагаю, до того, как были созданы эти классы атрибутов.

33 голосов
/ 12 марта 2010

Для NUnit 2.2, 2.4 (см. Простое решение ниже для 2.5):

Добавьте файл app.config в проект, содержащий ваши модульные тесты, и укажите следующее:

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

Вы можете проверить, что в квартире используется STA, с помощью следующего кода C #:

if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
   throw new ThreadStateException("The current threads apartment state is not STA");
}
4 голосов
/ 19 февраля 2014

В NUnit 2.6.1+ вы можете использовать флаг командной строки / 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
...
...