当从命令行运行mstest时TypeInitializationException

问题描述:

我们有一个单元测试的子集,直到最近一直通过Visual Studio运行。我现在正在开发一个可以运行测试的持续集成设置。所有的测试通过Visual Studio运行时通过,但是当我尝试从命令行使用mstest运行它们时,它们会失败,并显示“TypeInitializationException”,表示无法找到该类型的dll文件。当从命令行运行mstest时TypeInitializationException

System.TypeInitializationException: The type initializer for foo.bar_Accessor' threw an exception. 
---> System.IO.FileNotFoundException: Could not load file or assembly 'foo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. 
The system cannot find the file specified.Assembly manager loaded from: 
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 

有问题的dll是单元测试项目中的项目引用。还有一个测试参考可以创建该类的foo.bar_Accesor版本。

我注意到,当测试通过visual studio运行时,会创建一个包含IN和OUT文件夹的“Coverage _timestamp”文件夹。 OUT文件夹中包含foo.dll和foo_accesor.dll等。

当从命令行运行测试时,会创建一个仅包含OUT文件夹的“username _timestamp”文件夹。 OUT文件夹中包含foo_accesor.dll,但不包括错误消息中提到的foo.dll。

+0

有同样的问题。有没有找到解决方案? – Peter 2012-01-06 07:45:48

我设法用/noisolation开关解决了我们的问题。此开关描述为:

在MSTest.exe进程中运行测试。此选择可以提高测试运行速度,但会增加MSTest.exe进程的风险。

我的MSBuild脚本现在看起来是这样的:

<Target Name="Test" DependsOnTargets="Compile"> 
    <PropertyGroup> 
    <TestSuccessOrNot>1</TestSuccessOrNot> 
    </PropertyGroup> 
     <Exec Command='"$(VS100COMNTOOLS)..\IDE\mstest.exe" /noisolation /testcontainer:"C:\path\to\test.dll"' > 
    <Output TaskParameter="ExitCode" PropertyName="TestSuccessOrNot"/> 
    </Exec> 
    <Error Condition="$(TestSuccessOrNot) == 1" Text="Unit tests fail!"/> 
</Target>