.net 4.0 为什么在TeamCity上运行此MSpec测试时会出现无效的操作异常(非STA线程?)?

.net 4.0 为什么在TeamCity上运行此MSpec测试时会出现无效的操作异常(非STA线程?)?,.net-4.0,teamcity,mspec,sta,.net 4.0,Teamcity,Mspec,Sta,作为我的应用程序迁移到.NET4的一部分,我正在努力让一些WPF单元测试与TeamCity重新协同工作 在所有以某种方式使用WPF控件(例如ListItem)的测试中,我得到了一个以前没有得到的异常: System.InvalidOperationException: The calling thread must be STA, because many UI components require this. 我理解它的意思,经过检查,我的线程确实是MTA,而不是STA 我的问题是,我不知道

作为我的应用程序迁移到.NET4的一部分,我正在努力让一些WPF单元测试与TeamCity重新协同工作

在所有以某种方式使用WPF控件(例如ListItem)的测试中,我得到了一个以前没有得到的异常:

System.InvalidOperationException: The calling thread must be STA, because many UI components require this.
我理解它的意思,经过检查,我的线程确实是MTA,而不是STA

我的问题是,我不知道如何解决这个问题,这个问题可能来自哪里。。。 这是TeamCity的背景吗?MSpec? 在我切换到.NET4之前,它再次起作用

我尝试了许多不同的解决方案,但都不奏效

我也有点困惑,因为之前没有人报告过这一点(使用我的TeamCity+MSpec+WPF测试的特定堆栈),这可能意味着我在某个地方做了一些非常错误的事情

如果你有线索,请告诉我

完全例外:

System.InvalidOperationException: The calling thread must be STA, because many UI components require this.


 at System.Windows.Input.InputManager..ctor()
   at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
   at System.Windows.Input.KeyboardNavigation..ctor()
   at System.Windows.FrameworkElement.EnsureFrameworkServices()
   at System.Windows.FrameworkElement..ctor()
   at System.Windows.Controls.Control..ctor()
   at MyCompany.Dashboard.Client.Plugins.Common.Controls.Grids.CashflowGrid.ViewModel.ConfigureViewModel.CreateItem(String name) in d:\Program Files\JetBrains\BuildAgent2\work\6dd9af6ae2f9bbb9\Code\Src\MyCompany\Dashboard\Client\Plugins\Common\Controls\Grids\CashflowGrid\ViewModel\ConfigureViewModel.cs:line 171
   at MyCompany.Dashboard.Client.Plugins.Common.Controls.Grids.CashflowGrid.ViewModel.ConfigureViewModel.Initialise(Type type, IList`1 currentSelection, Action`1 selectionChangedCallback) in d:\Program Files\JetBrains\BuildAgent2\work\6dd9af6ae2f9bbb9\Code\Src\MyCompany\Dashboard\Client\Plugins\Common\Controls\Grids\CashflowGrid\ViewModel\ConfigureViewModel.cs:line 37
   at UnitTests.Plugins.Common.Controls.Grids.CashflowGrid.ViewModel.when_some_items_are_selected_on_the_chosen_list.<.ctor>b__1() in d:\Program Files\JetBrains\BuildAgent2\work\6dd9af6ae2f9bbb9\Code\Src\UnitTests.Plugins.Common\Controls\Grids\CashflowGrid\ViewModel\ConfigureViewModelTests.cs:line 82
它现在起作用了

但问题是我们无法解释。它仍然在不同的构建服务器上失败,但我们不关心这个

如果有人遇到了这个问题,下面是我们所做的:

  • 禁用测试覆盖率
  • 禁用MSPec任务:生成变为绿色
  • 重新启用覆盖率和MSpec:它有效
奇怪的是,在另一个构建服务器(我们不再使用的旧构建服务器)上应用了确切的过程,但仍然失败

我们想不出还有什么改变了


所以这有点神秘。。。我希望它不会回来咬我们

当您使用console runner运行规范时,它是否运行?如果是这样,您的问题与TeamCity无关。顺便说一句,mspec.exe的程序.Main()的属性是
[STAThread]
。这对于单元测试运行程序来说从来都不是问题。[StatThread]不起作用,它只在程序的入口点被识别。不适用于测试运行程序,入口点是运行程序本身,而不是测试代码。大多数测试运行程序都有一个选项来指定测试线程是MTA还是STA,我没有看到mspec的选项。mspec目前只支持STAThread。“我真的不明白你的意思,”汉萨桑说。规范是否与mspec.exe(控制台测试运行程序)一起运行?这是一个好问题。它与Resharper runner和NCrunch runner一起工作时没有问题,但没有尝试在本地使用mspec.exe手动运行它。让我立即尝试一下,然后再联系您。好的,我使用我在TeamCity端使用的同一个mspec-clr4.exe手动运行测试,它在本地运行得非常好,在TeamCity上失败。所以这肯定与TeamCity有关?如果我是在你的情况下,我想知道我是否真的需要对线程中的东西进行单元测试。难道代码不能被分解,这样你就可以在不需要激活多个线程的情况下对其进行单元测试吗?这完全超出了我的控制范围,测试是测试UI控件,线程是由框架创建的。顺便说一句,它仍然工作正常,仍然不知道最初出了什么问题。我会责怪我没有尽快牺牲一只山羊。
public class StaTestExample
{
    Establish context = () => _control = new ListBox();

    It should_not_be_null = () => _control.ShouldNotBeNull();

    protected static Control _control;
}