2009-03-04 15 views
4

私は最終的にweb.configファイルに巻き込まれる単体テスト値を取得しようとしています。私のテストプロジェクトでは、設定を保持するweb.configセクションを持つapp.configファイルを作成しました。通常の状況では、私はSystem.Configuration.ConfigurationSettings.AppSettingsを呼び出しますが、この場合は動作しません。私はthis questionを見ましたが、これは非常によく似ていますが、NameValueCollectionを設定ファイルから取得する方法については言及していません。設定ファイルの例を次に示します。app.configファイルのweb.configセクションから値を取得しますか?

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.web> 
     <membership defaultProvider="CustomMembershipProvider"> 
     <providers> 
      <clear/> 
      <add 
      name="CustomMembershipProvider" 
      applicationName="SettlementInfo" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="false" 
      requiresQuestionAndAnswer="true" 
      writeExceptionsToEventLog="true" /> 
     </providers> 
     </membership> 
    </system.web>  

</configuration> 

これまでに対処した人はいますか?

答えて

3

私はここで混乱していると思います。 ASP.NETがカスタムメンバーシッププロバイダを適切に使用していることをテストしようとしているようです。正しい?

もしそうなら、私は99.999%であり、これはMSフレームワークを使って単体テストできないと確信しています。 Webサーバーにそれをデプロイ(またはVSでCassiniを実行)し、ログインページにユーザー名/パスワードを入力して統合テストする必要があります。

あなたのリクエストを誤解している可能性があります。もしそうなら、私に教えてください。私はそれに応じて私の答えを編集します。

編集:右今の

、私は実際には値が存在しない場合は必ず ことを確認するために、設定ファイルの を出てくるのNameValueのペアをテストするために をしようとしています、私の のデフォルトが適用されています。 という単語では、 applicationNameをプルして が "SettlementInfo"と等しくなるようにしたいと思います。 その後、 統合テストを使用して、 ASP.NETがデフォルトフレームの代わりにカスタムフレームワーク を使用していることを確認します。その は意味がありますか?

返信する以上のコメントが必要なので、私は編集しています。私があなたを正しく読めば、プログラムを単体テストして設定が正しく行われるようにしたいのですか?つまり、あなたのコードが正しいAppSettingsキーを取得し、そこにヌル値を扱うようにすることを意味しますか?

これが当てはまる場合、あなたは運がいいです。 app.configまたはweb.configはまったく必要なく、テスト設定の一部として必要な値を設定できます。例えば

[TestMethod] 
public void Test_Configuration_Used_Correctly() 
{ 
    ConfigurationManager.AppSettings["MyConfigName"] = "MyConfigValue"; 
    MyClass testObject = new MyClass(); 
    testObject.ConfigurationHandler(); 
    Assert.AreEqual(testObject.ConfigurationItemOrDefault, "MyConfigValue"); 
} 

[TestMethod] 
public void Test_Configuration_Defaults_Used_Correctly() 
{ 
    // you don't need to set AppSettings for a non-existent value... 
    // ConfigurationManager.AppSettings["MyConfigName"] = "MyConfigValue"; 

    MyClass testObject = new MyClass(); 
    testObject.ConfigurationHandler(); 
    Assert.AreEqual(testObject.ConfigurationItemOrDefault, "MyConfigDefaultValue"); 
} 
+0

今のところ、私は実際に値が存在しなければ私のデフォルトが適用されていることを確認するために、設定ファイルから出てくるNameValueペアをテストしようとしています。言い換えれば、私はapplicationNameをプルしようとし、それが "SettlementInfo"と等しくなることを検証したいと考えています。 –

+0

その後、統合テストを使用して、ASP.NETが既定のフレームワークの代わりにカスタムフレームワークを使用していることを確認します。それは理にかなっていますか? –

+0

回答は私の編集を参照してください。私はあなたがこれでどこに行くのかまだ分かっていないかもしれませんが、もしそれが私の考えであれば、これは正しい方向にあなたを始めるべきです。 – Randolpho

0

web.configファイルに貼り付けてみませんか?

+0

私は単体テスト用のクラスライブラリに入っていますので、app.configを使用しています。 Webプロジェクトに追加すると、web.configに入ります。 –

+0

web.configファイルをクラスライブラリから参照する方法はありますか? –

1

あなたが好き引き出すためにConfigurationManager.GetSection()メソッドを使用することができるはずです。

+0

私はSystem.webとメンバーシップセクションでConfigurationManager.GetSection()を試しました。どちらもnullを返します。私は何か間違っているのですか? –

2

あなたのアプリケーションが実際に起動している間は、webconfigファイルにしかアクセスできないと思います。解決策はかなり簡単です - あなたの設定を "偽"してください。

private static NameValueCollection CreateConfig() 
{ 
NameValueCollection config = new NameValueCollection(); 
    config.Add("applicationName", "TestApp"); 
    config.Add("enablePasswordReset", "false"); 
    config.Add("enablePasswordRetrieval", "true"); 
    config.Add("maxInvalidPasswordAttempts", "5"); 
    config.Add("minRequiredNonalphanumericCharacters", "2"); 
    config.Add("minRequiredPasswordLength", "6"); 
    config.Add("requiresQuestionAndAnswer", "true"); 
    config.Add("requiresUniqueEmail", "true"); 
    config.Add("passwordAttemptWindow", "10"); 

    return config; 
} 

今、あなたは簡単にそれからのデータを解析し、あなたのクラスにそのコレクションを渡すことができます。代わりに、NameValueCollectionのと使用を使用してください。

1

実際には、NUnitを使用している場合は、テストプロジェクトのApp.configに貼り付けることができます。 次に、あなたのビルド後のイベントに次の行を追加します

コピー/ Y「$(PROJECTDIR)のApp.config」「$(TARGETDIR)$(TargetFileName)の.config」を

新しいプロバイダを作成する場合あなたのテストでは、NUnitは、あなたのapp.configの値をinitializeメソッドでプロバイダに渡します。

関連する問題