web-dev-qa-db-ja.com

STAThreadモードで単体テストを実行するにはどうすればよいですか?

クリップボード(WindowsForms)を使用するアプリをテストしたいのですが、ユニットテストでもクリップボードが必要です。使用するにはSTAモードで実行する必要がありますが、NUnit TestFixtureにはmainメソッドがないため、どこにどのように注釈を付けるかわかりません。

52
Peter

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>

次のC#コードを使用して、アパートメントのスレッドがSTAであることを確認できます。

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

Nunit 2.5+を使用している場合は、クラスで新しいThe RequiresSTAAttributeを使用できます

[TestFixture, RequiresSTA]

またはアセンブリレベル。

[Assembly:RequiresSTA]

設定ファイルは必要ありません。チェック: http://www.nunit.org/index.php?p=requiresSTA&r=2.5

100
mas_oz2k1

NUnit 3.

最近NUnit 3.0に移行しましたが、以前使用していた古い属性は機能しなくなりました。上記のmas_oz2k1の回答のように、テストでは[STAThread][RequiresSTA]の混合を使用しました。 STAThreadは検出されなくなったためコンパイルエラーを出し、RequiresSTAは非推奨になったため警告を出していました。

ニューディールは以下を使用しているようです:

アセンブリレベル

[Assembly: Apartment(ApartmentState.STA)]

クラスレベル

[TestFixture]
[Apartment(ApartmentState.STA)]

メソッドレベル

[Test]
[Apartment(ApartmentState.STA)]

この情報を見つけようとすると、CrossThreadTestRunnerと呼ばれるクラスを使用してテストコードを変更しているという暗い道を私は進みました。これは、これらの属性クラスが作成される前の2004年のソリューションでした。

56
JoelC

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