如何在STAThread模式下运行单元测试?

Pet*_*ter 51 c# nunit sta

我想测试一个使用剪贴板(WindowsForms)的应用程序,我也需要在单元测试中使用剪贴板.为了使用它,它应该在STA模式下运行,但由于NUnit TestFixture没有main方法,我不知道在哪里/如何注释它.

mas*_*2k1 100

如果您使用的是nunit 2.5+,则可以使用新的The RequiresSTAAttributeclass

[TestFixture, RequiresSTA]
Run Code Online (Sandbox Code Playgroud)

或装配水平.

[assembly:RequiresSTA]
Run Code Online (Sandbox Code Playgroud)

不需要配置文件.检查:http://www.nunit.org/index.php?p = requiresSTA& r = 2.5

  • `[RequiteSTA]`_now_废弃,使用`[Apartment(ApartmentState.STA)]`. (13认同)
  • 您还可以在各个测试方法上使用`RequiresSTA`,并且BCL`STAThread`属性用作`RequiresSTA`的同义词. (5认同)
  • 当尝试使用Visual Studio 2010 SP1中的ReSharper 5.1的测试运行器运行测试时,这是唯一有用的. (3认同)
  • 谢谢,它对我有用!比接受的答案更好. (3认同)

Joe*_*elC 58

NUnit 3.0

我们最近迁移到NUnit 3.0,我们使用的旧属性不再有效.我们的测试使用了mas_oz2k1上面的答案的混合[STAThread][RequiresSTA].STAThread因为不再找到而导致编译错误,而且RequiresSTA正在发出警告,因为它已被弃用.

新政似乎使用以下内容:

装配水平

[assembly: Apartment(ApartmentState.STA)]
Run Code Online (Sandbox Code Playgroud)

班级

[TestFixture]
[Apartment(ApartmentState.STA)]
Run Code Online (Sandbox Code Playgroud)

方法级别

[Test]
[Apartment(ApartmentState.STA)]
Run Code Online (Sandbox Code Playgroud)

试图找到这些信息让我走上了一条黑暗的道路,人们正在使用一个名为CrossThreadTestRunner的类来修改他们的测试代码.这是2004年我假设的解决方案,在创建这些属性类之前.

  • 这是NUnit 3.0+的答案.不要忘记包含`System.Threading`. (4认同)

Ber*_*ann 33

对于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>
Run Code Online (Sandbox Code Playgroud)

您可以使用以下C#代码验证公寓线程是否为STA:

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

  • 简单但令人沮丧的问题,即时的工作答案:有些日子我只是喜欢这样. (6认同)
  • 请注意,app.config文件必须以与dll对应的名称结尾.例如MyApp.Tests.dll.config for MyApp.Tests.dll.VS会自动为您执行此操作,但如果您不得不像我一样手动创建配置文件,请记住此步骤. (2认同)