CodeGo.net>如何在STAThread模式下运行单元测试?

我想测试一个使用剪贴板(WindowsForms)的应用程序,并且在单元测试中也需要剪贴板。 为了使用它,它应该在STA模式下运行,但是由于NUnit TestFixture没有主要方法,因此我不知道在何处/如何对其进行注释。

Peter asked 2020-01-24T10:36:56Z
4个解决方案
100 votes

如果您使用的是nunit 2.5+,则可以在课堂上使用新的RequiresSTAAttribute

[TestFixture, RequiresSTA]

或装配级别。

[assembly:RequiresSTA]

无需配置文件。 校验:[http://www.nunit.org/index.php?p=requiresSTA&r=2.5]

mas_oz2k1 answered 2020-01-24T10:37:54Z
58 votes

NUnit 3.0

我们最近迁移到了NUnit 3.0,而以前使用的旧属性不再起作用。 我们的测试使用了[STAThread][RequiresSTA]的混合物,就像上面mas_oz2k1的答案一样。 由于不再找到STAThread,因此它发出了编译错误,并且由于不推荐使用,所以RequiresSTA发出了警告。

新政似乎正在使用以下内容:

组装层

[assembly: Apartment(ApartmentState.STA)]

班级

[TestFixture]
[Apartment(ApartmentState.STA)]

方法级别

[Test]
[Apartment(ApartmentState.STA)]

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

JoelC answered 2020-01-24T10:38:40Z
33 votes

对于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");
}
Bernhard Hofmann answered 2020-01-24T10:37:25Z
4 votes

在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
...
Denis answered 2020-01-24T10:39:00Z
translate from https://stackoverflow.com:/questions/2434067/how-to-run-unit-tests-in-stathread-mode