59

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

4

4 回答 4

104

如果你使用的是 nunit 2.5+,你可以使用新的RequiresSTAAttributeat 类

[TestFixture, RequiresSTA]

或装配级别。

[assembly:RequiresSTA]

不需要配置文件。检查: http ://www.nunit.org/index.php?p=requiresSTA&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 回答
4

在 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
...
于 2014-02-18T21:55:26.783 回答