运行NUnit测试时出现STA问题

4
我有一些 NUnit 测试用例需要在 STA 模式下运行。
正如许多网站或博客(例如这里)所讨论的那样,我向我的 NUnit 测试程序集中添加了一个配置文件("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>

为了验证测试是否真正在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下运行我的单元测试呢?
3个回答

10

从 NUnit 2.5 开始,您可以使用 RequiresSTAAttribute。


最简单的 2.5 方法就是在您的 AssemblyInfo.cs 中添加 [assembly:RequiresSTA] 属性。与您所做的一样,我发现 NUnit 项目忽略了 App.config STA 设置(尽管 Resharper 和 Visual Studio 会遵守它)。应用程序集属性是一个好的“设置并忘记”的解决方案! - David Keaveny
如果您更新答案以包括NUnit 3.0的[Apartment(ApartmentState.STA)],则可以获得额外的积分。 - jnm2

1

评论经常被忽视,因为jnm2给出了一个重要的提示...如果我在这里添加这个评论作为额外的答案,显然我可以赚取一些奖励分数... ;-)

对于NUnit 3.x,请使用[Apartment(ApartmentState.STA)]

p.s. 额外奖励:我修复了文档链接。


0
对于 NUnit 3.11,我使用的另一种解决方案是在 AssemblyInfo 中添加以下属性:
[assembly: RequiresThread(ApartmentState.STA)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接