我正在尝试完成这个异常处理程序:
if (ConfigurationManager.ConnectionStrings["ConnectionString"]==null)
{
string pathOfActiveConfigFile = ...?
throw new ConfigurationErrorsException(
"You either forgot to set the connection string, or " +
"you're using a unit test framework that looks for "+
"the config file in strange places, update this file : "
+ pathOfActiveConfigFile);
}
这个问题似乎只发生在我使用 nUnit 时。
对于 .Net Framework,试试这个
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
对于 .Net core 或任何更新的内容,请参阅其他答案。
严格来说,没有单一的配置文件。不包括 ASP.NET1,使用内置 (
System.Configuration
) 支持可以有三个配置文件。除了机器配置之外:app.exe.config
、用户漫游和用户本地。
获取“全局”配置(exe.config):
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
.FilePath
ConfigurationUserLevel
值。
1 具有完全不同的模型,其中子文件夹(IIS 虚拟或文件系统)
web.config
的内容可以(根据设置)添加到或覆盖父文件夹的 web.config
。
如果您的意思是在使用 NUnit 时仅得到 null 返回,那么您可能需要将应用程序的 app.config 中的 ConnectionString 值复制到测试库的 app.config 中。
当测试加载器运行时,测试程序集在运行时加载,并将查找其自己的 app.config(在编译时重命名为 testAssembly.dll.config),而不是您的应用程序配置文件。
要获取正在运行的程序集的位置,请尝试
System.Reflection.Assembly.GetExecutingAssembly().Location
确保单击文件上的属性并将其设置为“始终复制”,否则它将不会与您满意的 lil dll 一起位于 Debug\ 文件夹中,以配置它需要的位置并添加更多牛铃
我第一次意识到单元测试项目引用了该项目中的 app.config,而不是与我的生产代码项目关联的 app.config(当然,DOH),我只是在产品的构建后事件中添加了一行项目会将 app.config 复制到测试项目的 bin 文件夹中。
问题解决了
到目前为止,我还没有注意到任何奇怪的副作用,但我不确定这是正确的解决方案,但至少它似乎有效。
我看到这里缺少另一个选项:
const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
根据您的配置文件的位置
System.Reflection.Assembly.GetExecutingAssembly().Location
可能会满足您的需要。
我在 Web 应用程序(实际上是本地运行的 Azure Web 角色)中尝试了之前的答案之一,但它不太有效。然而,这种类似的方法确实有效:
var map = new ExeConfigurationFileMap { ExeConfigFilename = "MyComponent.dll.config" };
var path = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None).FilePath;
配置文件位于 C:\Program Files\IIS Express\MyComponent.dll.config 中。有趣的地方。