为什么我从MSTest单元测试中收到InvalidComObjectException,但仅在构建服务器上?

时间:2013-02-23 02:35:00

标签: .net unit-testing tfs mstest

我有一个兼容性以后的项目碰巧调用COM,我有一些单元测试。当我从本地机器运行这些测试时,一切都很顺利。

但是当我的团队的构建服务器上运行这些测试时,我收到以下错误:

  

类初始化方法   Foo.Bar.Baz.Initialize   扔了例外。   System.Runtime.InteropServices.InvalidComObjectException:   System.Runtime.InteropServices.InvalidComObjectException:COM对象   已经与其基础RCW分离的不能使用..

我在2005-2008时间框架内看到过对Visual Studio早期版本的这类问题的一些讨论。但单位测试基础设施在2012年的时间框架内完全被替换。大多数解决方案似乎都涉及编辑“.testsettings”文件,而该项目没有。

我正在使用Visual Studio 2012 Update 1进行开发,而构建服务器和TFS实例正在运行TFS 2010 SP1。

1 个答案:

答案 0 :(得分:0)

原因是构建服务器上的TFS 2010 Team Tools使用的是Visual Studio 2010测试位。

我创建了一个包含以下内容的.testsettings文件,并将其签入TFS:

<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="Local" id="2010983b-bdae-4cf9-910d-08bad14e68cf" 
              xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>This forces tests to run as a MTA. (Visual Studio 2012 just works;
               2010 completely explodes on the build server)</Description>
  <Deployment enabled="false" />
  <Execution>
    <TestTypeSpecific />
    <AgentRule name="Execution Agents">
    </AgentRule>
    <ExecutionThread apartmentState="MTA" />
  </Execution>
</TestSettings>

请注意,我实际上并没有将此文件添加到Visual Studio 2012中的单元测试项目本身。然后,我将构建服务器的构建定义配置为指向已签入.testsettings文件。

这样我就可以在我的开发盒上使用Visual Studio 2012中的新(更好)测试运行器,但Visual Studio 2010测试运行器在构建服务器上运行良好。