我正在尝试完成此异常处理程序:
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时,这个问题似乎只发生在我身上。
答案 0 :(得分:347)
试试这个
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
希望有所帮助
答案 1 :(得分:61)
严格来说,没有单一的配置文件。排除ASP.NET 1 ,可以使用内置(System.Configuration
)支持三个配置文件。除了机器配置:app.exe.config
,用户漫游和用户本地。
获取“全局”配置( exe .config):
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
.FilePath
为每次使用的漫游和非漫游配置文件使用不同的ConfigurationUserLevel
值。
1 其中有一个完全不同的模型,其中子文件夹(IIS-虚拟或文件系统)web.config
的内容可以(取决于设置)添加或覆盖父文件夹web.config
。
答案 2 :(得分:9)
如果您的意思是在使用NUnit时只获得空返回,那么您可能需要将应用程序的app.config的ConnectionString值复制到测试库的app.config。
当它由测试加载程序运行时,测试程序集在运行时加载并查看它自己的app.config(在编译时重命名为testAssembly.dll.config),而不是你的应用程序配置文件。
要获取正在运行的程序集的位置,请尝试
System.Reflection.Assembly.GetExecutingAssembly().Location
答案 3 :(得分:6)
确保单击文件上的属性并将其设置为“始终复制”,否则它将不会位于Debug \ _文件夹中,您可以使用快乐的lil dll配置它需要的位置并添加更多的cowbell
答案 4 :(得分:6)
我第一次意识到单元测试项目引用了该项目中的app.config而不是与我的生产代码项目关联的app.config(当然,DOH)我刚刚在Post Build事件中添加了一行Prod项目将app.config复制到测试项目的bin文件夹。
问题解决了
到目前为止,我还没有注意到任何奇怪的副作用,但我不确定这是否是正确的解决方案,但至少它似乎有效。
答案 5 :(得分:4)
我看到的另一个选项是:
const string APP_CONFIG_FILE = "APP_CONFIG_FILE";
string defaultSysConfigFilePath = (string)AppDomain.CurrentDomain.GetData(APP_CONFIG_FILE);
答案 6 :(得分:3)
根据配置文件的位置System.Reflection.Assembly.GetExecutingAssembly().Location
可能会执行您所需的操作。
答案 7 :(得分:3)
我在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中。有趣的地方。