2

Windows Vistaマシンで「インターネットに接続されている」ネットワークアダプターのリストを取得するC#モジュールがあります。このモジュールは、「ネットワーク リスト マネージャー API」(または NLM API) を使用して、すべてのネットワーク接続を繰り返し処理し、IsConnectedToInternet 値が true であるすべての接続を返します。

このSOの質問で、このモジュールの実装に関する提案をいくつか受け取りました

このモジュールをテストするために、別のロジックに基づいてインターネットに接続されたインターフェイスのリストを返すヘルパーを作成することにしました。これは、元のモジュールのロジックの一種の「現実チェック」になります。テスト ヘルパーについては、実稼働コードの悪い習慣と見なされる可能性のある検出方法を喜んで使用することに注意してください (たとえば、「Google」などのインターネット リソースを利用できるようにする - シャットダウンしたり、内部ファイアウォールによってブロックされたりした場合など)。展開された製品ベースとは対照的に、テストを修正するのは比較的簡単です)。

私が選択した別の検出方法は、TcpClient を使用して「www.google.com:80」に接続することでした。私の問題: 複数のアダプター (ワイヤレスと LAN の両方など) が接続されている場合、そのうちの 1 つの検出方法が「既に接続されているソケットで接続要求が行われました」というエラーで失敗します。

私の質問は 3 つあります。

  1. 一般的に、そのようなモジュールをどのようにテストしますか? 同じことを別の方法で実行して結果を比較するという考えを支持しますか?それともやり過ぎで、システムの API に頼る必要がありますか? ここでの主な問題は、予想される結果が事前にわかるようにシステムを事前に構成するのが非常に難しいことです。

  2. どのような代替ロジックを提案しますか? 前述の質問で示唆されたことの 1 つは、ルーティング テーブルを調べることでした。宛先が 0.0.0.0 のルーティング エントリを持つ各アダプタを「インターネットに接続されている」と見なすのはどうでしょうか。他の提案?

  3. 現在のテスト ロジックで "既に接続されています" というエラーが発生する理由がわかりましたか?

4

3 に答える 3

4

単体テストに関する質問にしかお答えできません。

テストしているコードは、あなた自身の言葉で言えば、「Windows Vista マシンで「インターネットに接続されている」ネットワーク アダプターのリストを取得する C# モジュールです。モジュールは「ネットワーク リスト マネージャー API」を使用します (または NLM API) を使用して、すべてのネットワーク接続を反復処理し、IsConnectedToInternet 値が true であるすべての接続を返します。"

このモジュールを作成する場合、最初に NLM API のインターフェースを使用し、それを ...NLMAPIService と呼びます。次に、実際のコードとして、NLMAPIService を実装し、実際の NLM API を適応させるアダプターを作成します。

テストのために、NLMAPIService を実装する FakeNLMAPI クラスを作成し、そのすべてのデータをメモリ内のどこかに、または XML ファイルなどに格納します。モジュールは NLMAPIService でのみメソッドを呼び出すため、テストしているかどうかに応じて「実際の」コードを変更する必要はありません。

したがって、テスト セットアップ メソッドで FakeNLMAPI をインスタンス化してモジュールに渡し、本番環境で NLM API アダプターをインスタンス化できます。

ネットワーク接続を表すオブジェクトをインスタンス化して変更できると仮定します。そうでない場合は、実際のネットワーク接続オブジェクトを偽装するために同じパターンに従うことができます。

于 2008-10-12T13:40:40.387 に答える
2

依存性注入は、このような問題に対処するための非常に便利なパターンです。NLM API コンポーネントをコードで直接使用するだけでなく、それを実装して NLM API のプロキシとして機能するインターフェイスとクラスを定義します。このクラスのインスタンスをコンストラクターでモジュールに渡し、モジュールでそれを使用します。単体テストでは、実際のプロキシ オブジェクトの代わりに、既知の情報を返すモック オブジェクトを使用します (NLM API を参照する必要さえありません)。モジュールのロジックのテストに使用します。確かに、プロキシ クラスにもいくつかのテストが必要ですが、そのロジックははるかに単純で、おそらくデータ マーシャリングだけです。その正しさを自分で納得できるかもしれません。そうでない場合は、手動でテストを行って、正しく機能していることを確認してください。

于 2008-10-12T13:42:24.220 に答える
0

UnitTests は外部リソースにアクセスすべきではありません。メソッドの UnitTest を行うために、Network List Manager API をスタブ化します。

まだ受け入れテスト層が必要です。そのテスト環境では、環境でサポートすると予想されるさまざまな構成を複製し、独自の Web ホスト、ルーター、マシン構成をセットアップする必要があります。受け入れテストは、Fitnesse などのツールを使用して、ユーザー エクスペリエンス レベルで行う必要があります。

于 2008-10-12T13:22:45.740 に答える