2016-05-11 11 views
0

これらのテストの実行方法について少し混乱します。プライベートクラスをテストするPrivateObjectとプライベート静的クラスをテストするにはPrivateTypeの存在について知っていますが、どのようにしてPUBLIC静的クラスのプライベート静的メソッドをテストできますか?私のユニットテストクラスでパブリック静的クラスのC#テストプライベート静的メソッド

public static class Clients { 
    // CUT 
    private static List<string> GenerateAddresses(string AppPath) { 
     // CUT 
    } 
} 

は私が

PrivateType testClients = new PrivateType(Clients); 

を試してみましたが、私はエラーを取得

「顧客は、指定されたコンテキストでは有効ではないタイプです

エラーはちょっと混乱していて、Googleは完璧に別の問題を引き起こしています。 PrivateTypeで「クライアント」が間違っていますか?または、Clientsが公開されているという点で、私は別の方法でテストすべきですか?

+2

'新しいPrivateType(typeof(Clients))'? (サイドノート:プライベートメンバーを直接テストする必要があるのでしょうか?それは、オブジェクトのインターフェイスとその実装に多くの結合を作ります。これはテストには関係ありません)。 – David

+1

コンストラクタには'System.Type'で、型名ではありません。新しいPrivateType(typeof(Clients)) –

+0

PrivateTypeのコンストラクタを表示します。それは何を期待していますか?あなたが現在行っていることは、コンパイラがあなたに言っていることはまったく意味がありません。 – bashrc

答えて

6

Clientsが一般公開されているとは別の方法でテストしてください。

はい:Clientsは、テストしているユニットです。 GenerateAddressesが公開されていない場合は、そのAPIの一部ではなく、理論的にはクラスの内部をサポートするためのものです。

ユニットテストでは、クラスの観察可能な振る舞いをテストします。内部的に行う方法について心配する必要はありません。

+0

良いが、私は 'GenerateAddresses'プライベートメソッドによって実行される(かなり長い)コードをテストする必要があります。これを行うより良い方法はありますか? – Naigel

+1

ユニットテストでは、デザインの匂いを察知することができます。それがテストしたいものなら、それは一般に公開されるべきです。プライベートメソッドであまりにも多くの作業を行っている場合は、独自のテスト可能なパブリックインターフェイスを持つ新しいクラスにプライベートパーツを分割することを検討してください。プライベートメソッドの代わりにこの新しいクラスを使用します。 – mwm314

+0

本当に直接テストする必要がありますか?それが 'private'の場合は、クラスの他のメンバー(つまりそれらをテストする)のためにそこにあります。クラスの消費者(およびあなたのテスト)に関する限り、変更されるか、削除される可能性があります。 –

0

var testClients = new PrivateType(typeof(Clients));

PrivateTypeTypeオブジェクトではなく、シンボル名を期待。

しかし、私はむしろあなたのテスト戦略を再考することを提案したいと思います。通常、プライベートメソッドをテストする必要はありません。パブリックメソッドからまともなコードカバレッジを得ることができない場合は、リファクタリングが必要な場合があります。

関連する問題