我的单元测试具有来自项目外部目录中的dll池的依赖项。我们的政策通常是将这些dll(来自池)的链接放在名为" System"的目录中。在项目目录中,将CopyToOutputDirectory
设置为PreserveNewest
。之后,在项目中我们添加对池中dll的引用,但将其设置为 not 私有副本,这意味着它不会输出到构建目录。在InitAssembly()
方法中,我们设置了运行时也通过AppDomain.CurrentDomain.BaseDirectory, "System")
在AppDomain.CurrentDomain.AssemblyResolve
中搜索。
[TestClass]
public class SomeUnitTest : OurUnitTestBase
{
[AssemblyInitialize]
public static void AssemblyInit(TestContext context)
{
Debug.WriteLine("in AssemblyInit");
base.InitAssembly();
}
}
从VisualStudio内部运行代码时以及从VisualStudio的Test-Explorer(vstest.executionengine.x86.exe)中运行单元测试时,这很有用。但是,当从以下批处理脚本运行时,MSTest无法在System子目录中找到dll,该脚本使用opencover执行覆盖率分析:
REM Bring dev tools into the PATH.
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat"
mkdir .\CoverageAnalysisReport
REM Run unit tests through OpenCover
REM This allows OpenCover to gather code coverage results
.\..\..\Tools\CoverageAnalysis\opencover\OpenCover.Console.exe^
-register:user^
-target:MSTest.exe^
-targetargs:"/noresults /noisolation /testcontainer:..\bin\Debug\OurUnitTests.dll"^
-filter:+[*]*^
-output:.\CoverageAnalysisReport\output.xml
REM Generate the report
.\..\..\Tools\CoverageAnalysis\ReportGenerator\bin\ReportGenerator.exe^
-reports:.\CoverageAnalysisReport\output.xml^
-targetdir:.\CoverageAnalysisReport^
-reporttypes:HTML^
-filters:-OurUnitTests*
REM Open the report
start .\CoverageAnalysisReport\index.htm
生成的日志文件说,没有任何单元测试可以运行并因此失败。此外,它说明了
Warning: The assembly "BaseLib" as a direct or indirect dependency of the test container "C:\MyProject\bin\debug\ourunittests.dll" was not found.
但是我知道[AssemblyInitialize]被调用了,因为暂时放置的System.Windows.Form.MessageBox.Show(..)
实际上是在执行bat文件时显示的。
有没有办法告诉MSTest也在System子目录中搜索dll?