3

ping機能を単体テストする方法、またはRhinoMocksでモックできる方法を見つけたいと思っていました。

単体テストできるようにしたいコードの簡単な例を次に示します。

public PingReply PingMachine(string machineName)
{
    Ping ping = new Ping();
    return ping.Send(machineName);
}

public bool IsOnline(string machineName)
{
    var reply = PingMachine(machineName);
    if (reply.Status == IPStatus.Success)
    {
        return true;
    }
    return false;
}

独自のIPインターフェイスを作成してPingをIPに作成し、別のコンストラクターとそのための一連の作業を追加する以外に、これを簡単に単体テストする方法はありますか、それとも時間を無駄にしないでください。

4

2 に答える 2

2

私があなたのサンプルで見ることができる唯一の難しさはnew Ping()電話です。ある時点で、それが正しいデータで呼び出されたことを確認したい場合がありますがSend、現時点ではこれはほぼ不可能です。オブジェクトの作成は通常、ファクトリメソッドパターンで抽象化されるため、実際にで問題が発生した場合はnew Ping()、pingの作成をそのようなファクトリに委任し、テスト済みのクラスに注入することをお勧めします。コードは次のようになります。

// some minor injection work
public TestedClass(IPingFactory pingsFactory)
{
    this.pingsFactory = pingsFactory;
}

public PingReply PingMachine(string machineName)
{
    IPing ping = pingsFactory.Create();
    return ping.Send(machineName);
}
于 2012-04-12T07:16:07.457 に答える
2

コードをテスト可能にするための優れたアプローチをすでに知っているようです。抽象化に依存します。Ping、を使用しないでください。コンストラクタを介して、それを使用するクラスに提供してくださいIPingIPing

NinjectのようなIOCコンテナを調べて、特に多くの依存関係を配線している場合は、作業を楽にしてください。

あなたがすべきかどうかに関しては、「このコードをテスト可能にして、テストを書くべきか」という私の答えは、常に「はい」です。

このように考えてください:あなたはこの方法を持っています、IsOnline(string machineName)。別の場所でコードを記述していて、そのコードをテストしたいとします。しかし、そのコードはIsOnline!突然、それをテストすることはさらに難しくなりました。ping提供クラスをモックできれば、テストは簡単です。

于 2012-04-12T02:07:00.110 に答える