VSTest 是 TFS 2015 用于单元测试的工具,它希望默认忽略应用程序配置/设置 (app.config)。VSTest 采用可选的“运行设置”配置文件,但它不包含有关app.config文件的任何信息。现在,从runsettings文件中,您可以告诉它进入“传统”模式:
<RunSettings>
<MSTest>
<ForcedLegacyMode>true</ForcedLegacyMode>
</MSTest>
</RunSettings>
...这将允许它使用同一目录中的app.config文件(这些是程序集/库,因此配置文件只是命名为“app.config”而不是“application.exe.config”)。但是,它不会找到包含的文件。例如,我有一个单独的连接字符串文件。它包含在app.config的顶部:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings configSource="connectionStrings.config" />
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
每次我都会收到一个关于它如何找不到文件的错误:
2016-09-21T18:36:12.2439565Z ##[error]Error Message:
2016-09-21T18:36:12.2439565Z ##[error] Test method Assembly.Project.Class threw exception:
2016-09-21T18:36:12.2595841Z ##[error]System.Configuration.ConfigurationErrorsException: Unable to open configSource file 'connectionStrings.config'. (D:\Agents\A3\_work\464b36816\TestResults\Definition_Host 2016-09-21 14_36_09\Out\Assembly.DLL.config line 7)
2016-09-21T18:36:12.2595841Z ##[error]Stack Trace:
因为它只允许是相对的(否则,你会得到另一个错误),我尝试在前面加上“.\”(这似乎在其他情况下也可以)并引用它上面的下几级目录,但它不会找到引用的连接字符串文件。
好的。所以我想检查执行逻辑以确定工作目录是什么。启动测试的 TFS 2015 任务称为 VSTest.ps1。它指的是一个名为“Invoke-PSTest”的cmdlet,以便调用“vstest.console.exe”来实际运行测试。这在磁盘上绝对不存在,因为它是自己的文件或任何 psd1/psm1 文件,因此它必须由二进制程序集提供。
但是,我显然也避免按照我应该的方式向单元测试提供数据源/连接字符串。毕竟,我必须使用“传统”模式才能让 VSTest 使用我的配置文件。
那么,为单元测试提供应用程序配置(例如连接字符串)的正确方法是什么?毕竟,有时您实际上需要外部资源才能正确测试。