クリップボード (WindowsForms) を使用するアプリをテストしたいのですが、単体テストでもクリップボードが必要です。それを使用するには、STA モードで実行する必要がありますが、NUnitTestFixture
には main メソッドがないため、どこにどのようにアノテーションを付けるかわかりません。
4 に答える
nunit 2.5以降を使用している場合は、新しいTheatRequiresSTAAttribute
クラスを使用できます。
[TestFixture, RequiresSTA]
またはアセンブリレベル。
[assembly:RequiresSTA]
設定ファイルは必要ありません。チェック: http ://www.nunit.org/index.php?p = requireSTA&r = 2.5
NUnit 3.0
最近 NUnit 3.0 に移行したところ、使用していた古い属性が機能しなくなりました。私たちのテストでは、上記の mas_oz2k1 の回答にある[STAThread]
との混合物を使用しました。[RequiresSTA]
STAThread は見つからなくなったためにコンパイル エラーを出し、RequiresSTA は廃止されたため警告を出していました。
ニューディールは以下を使用しているようです。
組立レベル
[assembly: Apartment(ApartmentState.STA)]
クラスレベル
[TestFixture]
[Apartment(ApartmentState.STA)]
メソッドレベル
[Test]
[Apartment(ApartmentState.STA)]
この情報を見つけようとして、人々が CrossThreadTestRunner というクラスを使用してテスト コードを変更していた暗い道に迷い込みました。これは、これらの属性クラスが作成される前の 2004 年の解決策だったと思います。
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");
}