在 STA 下运行 NUnit 测试的问题
Posted
技术标签:
【中文标题】在 STA 下运行 NUnit 测试的问题【英文标题】:Problem with runnig NUnit tests under STA 【发布时间】:2009-08-10 18:05:24 【问题描述】:我有一些 NUnit 测试用例需要在 STA 模型下运行。
正如在许多网站或博客(例如 here)中所讨论的,我向我的 NUnit 测试程序集添加了一个配置文件(“app.conig”),其中包含以下内容。
<?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>
为了验证测试是否真的在 STA 下运行,我放置了这个测试用例:
[Test]
public void CheckSTA()
ApartmentState aptState = Thread.CurrentThread.GetApartmentState();
Assert.IsTrue(aptState == ApartmentState.STA);
如果我在 NUnit 控制台或 NUnit GUI 上运行我的单元测试不使用 NUnit 项目文件,这会很好。
但是,一旦我通过 NUnit 项目文件 (.nunit) 将单元测试加载到 NUnit GUI,单元测试就会开始失败。
我已按照此博客 (Here) 上的内容尝试了不同的配置文件名,但使用“app.config”以外的任何配置文件名都会导致我的单元测试在任何情况下都失败。
也就是说,设置它以便我的单元测试无论如何都在 STA 下运行的正确方法是什么?
【问题讨论】:
【参考方案1】:从 NUnit 2.5 开始,您可以使用 RequiresSTAAttribute。
【讨论】:
请在nunit.org/index.php?p=requiresSTA&r=2.5找到文档和示例代码 最简单的 2.5 方法就是将 [assembly:RequiresSTA] 属性添加到您的 AssemblyInfo.cs。正如你所做的那样,我发现 NUnit 项目忽略了 App.config STA 设置(尽管 Resharper 和 Visual Studio 会尊重它)。应用程序集属性是一个很好的即发即弃的解决方案! 如果您更新答案以包含 NUnit 3.0 的[Apartment(ApartmentState.STA)]
,则可获得奖励积分。【参考方案2】:
评论经常被忽略,因为jnm2 给出了一个重要的提示......显然,如果在此处添加此评论作为附加答案,我可以获得一些奖励积分...... ;-)
对于 NUnit 3.x 使用 [Apartment(ApartmentState.STA)]
附言额外奖励:我修复了文档的链接。
【讨论】:
【参考方案3】:对于 NUnit 3.11,另一个对我有用的解决方案是将以下属性放在 AssemblyInfo 中:
[程序集:RequiresThread(ApartmentState.STA)]
【讨论】:
以上是关于在 STA 下运行 NUnit 测试的问题的主要内容,如果未能解决你的问题,请参考以下文章