2009-07-15 12 views
3

私は、nunitとRhino mockを使って次のようなクラスの単位を書いています。単体テストで期待される引数でプライベートメソッドが呼び出されたかどうかを確認する方法は?

Class MyClass 
{ 
    private void M() 
    { 
    N("Hi"); 
    } 

    private void N(string text) 
    { 
    ........ do something 
    } 
} 

メソッドMの単体テストでは、メソッドNが引数 "Hi"で呼び出されたかどうかをチェックしたいと思います。どうすればいいのですか?

答えて

10

テストの観点からは、オブジェクトの実装の詳細を掘り下げているように思えます。メソッド呼び出しの最終結果をチェックしてテストを実行できませんか?つまり、おそらくこれらのメソッド呼び出しには何らかの影響があります。渡される引数をチェックするのではなく、最終結果をチェックする必要があります。

このようにして、後で基礎コードを変更することができます。ユニットテストでは、実装とは無関係に最終的な結果が同じであることが確認されます。

+1

ブライアンは、私は完全ので、私が行っていることは、私は法Nに対するリターンユニットテストを持っているので、メソッドの実行結果を確認するつもりはないあなたに同意しますが、私のクラスメソッドNにいくつかの場所で呼ばれていますメソッドMの単体テストではNです。私の場合は、メソッドNはメソッドMの結果に対してほとんど貢献しません。 – Prithis

+0

あなたは1つのクラスであまりにも多くのことをしようとしている可能性があります。メソッドが別のクラスにリファクタリングされるべきではないかどうか確かめてください –

+0

それがいくつかの場所でリファクタリングしてコードを使用している場合。メソッドを一般に見えるようにしてテストします。その後、コード内でそのクラスを使用できますが、実装の詳細は隠しておくことができます。 – Finglas

1

あなたのメソッドN()を使用してください。

http://www.mockobjects.com/

しかし、ブライアン・ソリューションは優れている - それは良いユニットテストのために良い方向だと思います。

2

+1ブライアンの応答。

代わりに、 "N"を別のクラスに分割し、テストでそのクラスの模擬インスタンスを使用することもできます。次に、モックを設定して、特定のパラメータを持つコールを待つことができます。しかし、それを分割することは実際には適切ではないかもしれません。あなたの正確なシナリオによって異なります。

+0

いいアイデアですが、私のシナリオではそれは価値があるとは言いませんでした。 – Prithis

0

次のコードを参考にしてください。

var mock = new Mock<IFoo>(); 
bool called=false; 
string test=string.empty; 
mock.Setup(foo => foo.Execute(It.IsAny<string>())).Callback((string s) => { test = s; called = true;}); 
Assert.IsTrue(called, "Execute() was not called"); 
関連する問題