2016-04-19 9 views
0

私はうまく動作しているapp.configを持っています。ファイルアクセスなしでアプリケーション設定を取得する

しかし、私はまた、自動テストのためのツールを持っています。これは、ファイルへのアクセスがない環境でいくつかのテストを実行します。だから、文字列(またはメモリストリーム)から設定ファイルを読む必要がありますが、この自動テストプロセスからのファイルシステムへのアクセスがないため、にマッピングすることなくを物理的にマッピングする必要はありません。

実際には、設定ファイルはどこかに保存されていますが、自動テストのために、メモリに格納された文字列から設定ファイルを読み込むための回避策が必要です。それも可能ですか?私はたくさんのグーグルで探せましたが、私が見つけたのはSave it as temp file and then readですが、それは私の場合ではありません。

+0

何らかのデータベースをストレージと見なすかもしれませんが、それは良い解決策にはなりません。 – Vladimir

+0

あなたのツールにはどのような入力がありますか?環境変数を読み取ることはできますか?それは製品ですか、それとも作成しましたか? – Gubr

+0

すべてを読むことができます。ユーザーにはアクセス権がないか、ディスクに書き込むだけです。私は今のところMMFを探していますが、まだ動作しているかどうかはまだ分かりません。 –

答えて

1

のapp.configまたは他のファイルに自分のクラスからの直接の依存を避けることができます。クラスにはapp.configまたはProperties.Settingsは必要ありません。これらのファイルに含まれる値はである必要があります。

テスト目的で回避策を作成する場合は、クラスの別のバージョンをテストしています。これは固有の問題です。これらのファイルへの直接の依存性はテスト可能ではありません。彼らが何らかの形で悪いことや、それらを使うべきではないということを意味するのではなく、値を必要とするクラスがファイルからそれらを読み取るべきでないということだけです。

理想的な解決策は、依存性注入の一形態であるコンストラクタインジェクションです。そのコンストラクタ内のクラスに値を与え、それをフィールドとして格納します。そのようにしてクラスが作成されると、クラスには常に必要な値が設定されます。

依存性注入コンテナを使用することができます。ここにはwalkthrough on setting one up for WCFがあります。異なるプロジェクトタイプの可能性は高いですが、コンセプトはそのまま適用されます。

しかし、テストのために、クラスを作成し、使用したい値をコンストラクタに渡すだけで簡単です。クラスが設定から読み込むときには異なる値でテストすることは不可能ですが、コンストラクタインジェクションを使用するのは簡単です。

+0

あなたは正しいです。単体テストではなく、統合テストなので、適切なenvorinment設定が必要です。したがって、ファイル自体がなければ適切なファイル解析をテストすることは不可能なので、私はファイルアクセスを求めます。 'ConfigurationManager'はストリームに適切なAPIを提供しないのは残念ですが、serializarion自体についてすべてを処理できる間に、ラッパーを記述したくありません。はい、それを嘲笑することはできませんが、私のテスト目的は非常にこの仕事でした:XMLで書かれたすべてのデータがドメインオブジェクトに適切にマッピングされていることを確認します。 –

1

設定ファイルがないと、デフォルトの設定になります。あなたはデフォルト値を上書き可能性があります

Properties.Settings.Default["PropertyName"] = NewPropertyValue"; 

(あなたの設定クラスに正しいアクセス修飾子を設定し、それがライブラリ内にある場合は、正しい名前空間を使用)

0

最初のオプションとして、私は中に設定ファイルのために行くだろうあなたの場合。 あなたのユーザーでさえも、設定ファイルの内容にアクセスすることはできません。それから、particualrプロパティのデフォルト値が返されます。

あなたは

static void Main(string[] args) 
{ 
    Console.WriteLine(Settings.Default.MyProperty); 
    Console.ReadLine(); 
} 

愚かなコンソールアプリケーションをcreaty試すことができますが、あなたがあなたの設定タブプロジェクトのプロパティMYPROPERTYのためのあなたの値を設定しました。 次に、ソリューションをビルドし、バイナリフォルダを開き、exe.configファイルを削除すると、アプリケーションがデフォルト値を使用することがわかります。

第2のオプションとして、コマンドライン引数を使用できます。あなたのためのオプションでもあります。 (ここでは、コマンドライン引数Backslash and quote in command line argumentsのためのいくつかのトリッキーなケースについての記事)

第三の選択肢は、Cであなたのファイルを置くことができます:\ユーザーは、アプリのユーザーを\ \のAppData \ローミング\ YourAppNameフォルダを。ここで私はまた、この記事を見てreccomendう教育のためにも制限されたユーザーのためのファイルアクセスのための

を付与する必要があります。https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(ApplicationSettingsOverview);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5)&rd=true たぶん、あなたは「負荷Web設定」オプション素敵を見つけます。

調査のためのもう一つのpalceは

関連する問題