59

クリップボード (WindowsForms) を使用するアプリをテストしたいのですが、単体テストでもクリップボードが必要です。それを使用するには、STA モードで実行する必要がありますが、NUnitTestFixtureには main メソッドがないため、どこにどのようにアノテーションを付けるかわかりません。

4

4 に答える 4

104

nunit 2.5以降を使用している場合は、新しいTheatRequiresSTAAttributeクラスを使用できます。

[TestFixture, RequiresSTA]

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

[assembly:RequiresSTA]

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

于 2011-03-13T23:39:44.827 に答える
78

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 年の解決策だったと思います。

于 2016-02-23T20:30:32.313 に答える
34

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");
}
于 2010-03-12T16:25:54.980 に答える