以下のクラスの「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;
}
}
ここでテストしたいのは、ValidateStuffExistsとCheckUniquenessが呼び出され、引数が渡されることだけです。この関数が行うのはこれだけなので、テストするのはこれだけです(「パブリック動作のみをテストする」という疑似ルールを曲げて、ここでプライベートメソッドをテストします。これは、1つの大きな複雑なメソッド/テストまたは2つのプライベートテストがあるためです。メソッド)。
私はどんなモックライブラリにも門戸を開いています。私はNMockを使用していて、それがタスクに適しているとは思いませんでした-読んだ後、TypeMockをダウンロードしました。これが最高であり、具体的なクラスや非インターフェイスメソッドの呼び出しでさえもモックアウトできると聞きました...
私はテストでこのようなことをしていますが、「Isolate.WhenCalled」行で例外がスローされます。
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つのメソッドを別々のクラス/インターフェイスに分割せずにこれを行うにはどうすればよいですか?