无法识别的配置部分userSettings渲染单元测试无用

时间:2017-10-27 16:19:46

标签: c# .net unit-testing app-config user.config

今天我出乎意料地得到了以下配置异常(VS2015 Update 3,.Net 4,Win 7):Configuration system failed to initialize并且消息Unrecognized configuration section "userSettings"有一个内部异常。但是我只在单元测试中得到它,而不是当我从程序的任何部分运行相同的代码时!

我之前在几个不同的独立解决方案中看到了这个确切的例外,在直接或间接访问applicationSettings的单元测试中,例如通过Settings.Default.MySetting1

但对我来说,高潮是一个小小的单元测试,用于微小的XSL转换,我首先尝试在控制台应用程序的单元测试之外,它运行良好。令人惊讶的是,单元测试的Exception摘录表明,.Net Class System.Xml.Xsl.XslCompiledTransform在其实现中使用了Settings!例外的摘录是:

   at System.Configuration.ConfigurationManager.GetSection(String sectionName)
   at System.Xml.XmlConfiguration.XsltConfigSection.get_LimitXPathComplexity()
   at System.Xml.Xsl.Qil.QilDepthChecker.Check(QilNode input)

(如果你愿意,我可以添加整个例外细节,但实际上很无聊......)

(如果需要,我可以添加整个单元测试和XSL文件,但为了简洁起见,还没有。)

我不需要任何应用程序或用户配置 - 无论是在我的程序中,还是在单元测试中都没有!

更令人讨厌的是,同一个单元测试在同事的计算机上运行。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

我实际上想要添加一个最简单的问题单元测试,所以我查看了System.Xml.XmlConfiguration.XsltConfigSection.get_LimitXPathComplexity() here的来源。然后我创建了这个小单元测试:

[TestMethod]
public void TestMethod1()
{
    XsltConfigSection section = System.Configuration.ConfigurationManager.GetSection("system.xml/xslt") as XsltConfigSection;
    Assert.IsNull(section);
}

这给我带来了一个更具体的例外,抱怨错误的配置:

Test method FooBarTest.UnitTest1.TestMethod1 threw exception: 
System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize --->
System.Configuration.ConfigurationErrorsException: Unrecognized configuration section "userSettings".
(C:\Users\MyUserName\AppData\Local\Microsoft_Corporation\UnitTestAdapter__Running__StrongName_upyrcu25zoxkptlqai01cl4s0dwzhuof\14.0.23107.0\user.conf

问题出在我的Windows 7(64位)上的“user.config”文件中:

<configuration>
    <userSettings>
        <MyNamespace.MyAppXY.Properties.Settings>
            <setting name="LastPosition" serializeAs="String">
                <value>1234</value>
            </setting>
        </MyNamespace.MyAppXY.Properties.Settings>
    </userSettings>
</configuration>

这些用户设置是几个月前编写的,通过单元测试中完全不同的,无关的解决方案,间接使用:

Settings.Default.LastPosition = 1234;
Settings.Default.Save();

奇怪的是,“user.settings”文件中缺少配置部分:<configSections><sectionGroup name="userSettings" ...>。删除“user.settings”文件并重播包含Settings.Default.Save();的单元测试,将错误的“user.settings”文件再次写回确切的路径,如上所示的确切路径...

但是,我删除了“user.settings”文件,现在所有不同的独立解决方案中的所有单元测试都因为配置异常而再次出现“失败”!

这不是为什么存在此问题的确切解释,而是问题的解决方案/解决方法。解决这个问题的方法可以推广到与#34;无法识别的配置部分&#34;相关的问题,而不仅仅是我认为的单元测试问题。

查找配置文件非常有用,因为麻烦在C#语句之后(在this site上找到)。试着在&#34;立即窗口&#34;中评估它们。在调试单元测试期间:

System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None).FilePath
<path to my unit test proj>\bin\Debug\TestMetaDataEvaluator.dll.config

System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath
C:\Users\MyUserName\AppData\Local\Microsoft_Corporation\UnitTestAdapter__Running__StrongName_upyrcu25zoxkptlqai01cl4s0dwzhuof\14.0.23107.0\user.config

System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.PerUserRoaming).FilePath
C:\Users\MyUserName\AppData\Roaming\Microsoft_Corporation\UnitTestAdapter__Running__StrongName_upyrcu25zoxkptlqai01cl4s0dwzhuof\14.0.23107.0\user.config

我希望这可以帮助你,因为它帮助了我。