コンクリートクラスでプライベートメソッドを主張する方法(Typemock/nmock/etc ..)が呼ばれますか?
-
23-09-2019 - |
質問
私は以下のクラスで「isunique」関数のユニットテストを作成しようとしています。
class Foo
{
public bool IsUnique(params...)
{
ValidateStuffExists(params);
return CheckUniqueness(params);
}
private void ValidateStuffExists(params)
{
//does some validation
}
private bool CheckUniqueness(params)
{
//does logic to determine if its unique per params
return result;
}
}
ここでテストしたいのは、valimateStuffexistsとcheckUniquenessが呼び出され、引数に合格したことです。これがすべてこの関数であるため、テストするすべてです(「テストのパブリック行動のみ」を曲げて、ここでプライベートメソッドをテストします。方法)。
私はあらゆるモッキングライブラリに開かれています。私はNmockを使用していましたが、タスクのためにそれがあるとは思わなかったので、読書をしたのでTypeMockをダウンロードし、これが最高であり、具体的なクラス /非インターフェイスメソッド呼び出しさえもモックアウトできると聞きました...
私は私のテストでこのようなことをしています、そして、それは「隔離」で例外をスローします。
CrmEntityUniqueValidator_Accessor target = new CrmEntityUniqueValidator_Accessor(); // TODO: Initialize to an appropriate value
DynamicEntity entity = null; // TODO: Initialize to an appropriate value
string[] propertyNames = null; // TODO: Initialize to an appropriate value
bool tru = true;
Isolate.WhenCalled(() => target.CheckUniqueness(entity, propertyNames, null, null)).WillReturn(tru);
target.ValidatePropertiesExist(entity, propertyNames);
Isolate.Verify.WasCalledWithArguments(() => target.ValidatePropertiesExist(entity, propertyNames));
Isolate.Verify.WasCalledWithArguments(() => target.CheckUniqueness(entity, propertyNames, null, null));
これは、ような例外をスローします 「*** WhenCalledは、メソッド呼び出しを引数として使用することをサポートしていません。」
CLRクラスで同じことをすることができますが、DateTimeを模倣できます。
DateTime endOfWorld = new DateTime(2012, 12, 23);
Isolate.WhenCalled(() => DateTime.Now).WillReturn(endOfWorld);
DateTime dt = DateTime.Now;
Assert.AreEqual(dt, endOfWorld);
誰かがここに何かアドバイスがありますか?これらの2つの方法を別々のクラスに分割し、インターフェイスを作成する必要がありますか?または私の方法/テストを複雑にしますか?ここに私が見逃しているものがあるに違いありません...事前に助けてくれてありがとう。
編集:1ユニットテストのために、クラスの2つのプライベートメソッドを模倣しようとしていると思います。これらの2つの方法を別々のクラス /インターフェイスに分割することなく、これを行うにはどうすればよいですか?
解決
asealte.nonpublic.whencalled(object、 "non -public method")を試してください。
またはasealte.verify.nonpublic.wascalled(object、 "method" ..
他のヒント
ラノモックには AssertWasCalled
メソッドが別のメソッドを呼び出すことを保証する目的を果たす可能性のある方法...しかし、単体テストであるのと同じクラスのプライベート機能でそれを行うことができるかどうかはわかりません。あなたがスタブしたい2つの方法が注入された別の依存関係クラスにあった場合にのみ、あなたはそれをすることができると思います。