2017-10-27 6 views
0

今日、驚くべきことに、次の設定例外(VS2015アップデート3、.Net 4、Win 7):Configuration system failed to initializeがあり、メッセージで内部例外が発生しました。Unrecognized configuration section "userSettings"しかし、単体テストでしか得られません。プログラムのどの部分からも同じコードを実行したときではありません!認識できない設定セクションuserSettingsレンダリングユニットテストが役に立たない

これまで、いくつかの異なる独立した解決策、すなわちapplicationSettingsに直接的または間接的にアクセスする単体テストでこの正確な例外が見られました。 Settings.Default.MySetting1を介して。

しかし私にとってのクライマックスは、小型のXSLトランスフォーメーションのための小さなユニットテストでした。私は最初にコンソールアプリケーションのユニットテストの外で試してみましたが、うまくいきました。驚くべきことに、ユニットテストからの例外の抜粋は、.NetクラスSystem.Xml.Xsl.XslCompiledTransformはその実装で設定を使用していることを示しました!例外の抜粋は以下のとおりです。

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

(あなたが好きなら、私は全体の例外の詳細を追加することができますが、それは実際には退屈です...)

必要に応じて(私は全体のユニットテストとXSLファイルを追加することができますしかし、それほど簡単ではありませんでした。)

私のプログラムやユニットテストでは、アプリケーションやユーザーの設定は必要ありません。

同じ単体テストが同僚のコンピュータで動作するということは、さらに厄介なことです。

誰でも私を助けることができますか?

答えて

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 

問題は、または「user.config」ファイルにありました私のWindows 7(64ビット)上:

<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"ファイルを作成し、今度はすべてのユニットテストを異なる独立したソリューションで実行しました。

これは、この問題が存在する理由は正確ではありませんが、問題の解決策または回避策です。この問題の解決策へのアプローチは、私が思っている単体テストの問題だけでなく、「未知の構成セクション」に関連する問題に一般化することができます。

問題がC#ステートメント(this siteにあります)に続く問題を引き起こしている構成ファイルを見つけるのに便利です。ちょうどあなたのユニットテストのデバッグ中に「イミディエイトウィンドウ」でそれらを評価しよう:

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 

私はそれが私を助けたとして、これは、あなたを助けることができると思います。

関連する問題