ユニットテスト可能なものが必要な場合は、実装と少なくとも同じ厳密な抽象に依存する必要があります。
通常、クラスのコンストラクタまたはプロパティメソッドを使用して依存関係を取得します。あなたのクラスの消費者は、コンパイル時に依存関係が何であるか知っているので、コンストラクタが一般的に好まれます。
public void int Main(string[] args)
{
// Validate the args are valid (not shown).
var config = new AppConfig();
config.Value1 = args[0];
config.Value2 = int.Parse(args[1]);
// etc....
}
public class MyService()
{
private AppConfig _config;
public MyService(AppConfig config)
{
this._config = config;
}
}
通常、データはシリアル化可能なため、設定オブジェクトはインターフェイスの背後に置かれません。それがメソッドを持たない限り、私はoverride
-dの振る舞いを持つサブクラスに置き換える必要はありません。また、私はちょうどnew
私のテストでそれを直接することができます。
また、コマンドライン引数そのものをサービスに抽象化したいと思ったときに、コマンドラインの背後にあることを知る必要があるのはなぜですか?私が得た最も近いものは、簡単な解析のためにPowerArgsを使用していますが、私はMain
でそれを消費します。私が普通にやっていることは、コマンドライン引数でWebサーバーのポート番号を読み取るようなものです(私は、同じマシン上でWebサーバーの複数のコピーを実行できるように、アプリケーションのユーザーに選択させます私はデバッグしている間にポートを競合しないで自動化されたテストを実行できます)、それらを直接私のMain
クラスで解析してください。私のWebサーバーでは、解析されたコマンドライン引数、この場合はint
に依存しています。そうすれば、設定がコマンドラインから来ているということは無関係です。後でApp.config
ファイルに移動できます(基本的にはプロセスのライフサイクルに縛られています)。 configSource
ファイル。
一般的なコマンドラインの抽象度に依存するのではなく(純粋なままにしておけば、各サービスの消費は再解析する必要があります)、私は通常、強く型付けされたオブジェクトにコマンドラインとApp.config
の依存関係を抽象化します - アプリレベルのコンフィグクラスとテストレベルのコンフィグクラスがあり、必要に応じて複数のコンフィグレーションオブジェクトを導入する必要があります(アプリはこれを気にする必要はありませんが、E2EテストインフラストラクチャではApp.config
の別の部分にこれが必要です:クライアントの静的ファイルはどこから取得するのですか?テスト環境や開発環境でビルドスクリプトを取得して、index.htmlファイルの自動生成/自動更新などを行います)。
これまでに試したコードを投稿できますか? – ManoDestra
Moqを使用しようとしましたか?任意のメソッドが必要なものを返すようにすることができます。 – Wjdavis5
@ Wjdavis5私は、インターフェイスではなく、実際のクラスを模擬しようとした経験がありませんでした。しかし、いくつかの異なる解決策が出てきました。私は実際にユニットテストしているロジックを1に変更しました。これはmoqに適用できます。 – lentinant