Typemockを使用してDateTime.Parseを偽造し、任意のパラメーターを使用して呼び出されたときに同じ日付を返すようにする方法が必要です。
ロード時に日付として解析される暗号化された文字列を格納するDBフィールドがあります。データを保持するクラスにはLoad()メソッドがあり、DBデータをそのプロパティにコピーし、暗号化されたものを復号化し、次のような基本的な検証を行います。
public class BusinessObject{
public DateTime ImportantDate{get;set;}
...
public void Load(DBObject dbSource){
...
ImportantDate = DateTime.Parse(DecryptionService.Decrypt(dbSource.ImportantDate));
}
}
ランタイムはすべてうまく機能します。
TypeMockを使用して単体テストを作成し、Loadメソッドを使用して偽のデータをBusinessObjectにロードしようとしています。BusinessObjectには非常に多くのプロパティがあり、XMLから逆シリアル化することはできませんが、DBObjectは可能であるため、有効なデータを表すXMLをいくつか保存しました。
データを復号化するためにDecryptionServiceが呼び出されるまで、すべて正常に機能します。開発マシンには暗号化プロセスで使用されるDB証明書がないため、機能しません。テストのためだけにそれらを自分のマシンにインストールすることはできません。これはセキュリティ違反になります。
これを単体テストに追加しました:
Isolate.Fake.StaticMethods<DecryptionService>(Members.ReturnRecursiveFakes);
Isolate.WhenCalled(() => DecryptionService .Decrypt(null)).WillReturn("***");
Isolate.Fake.StaticMethods<DateTime>(Members.ReturnNulls);
Isolate.WhenCalled(() => DateTime.Parse("***" /*DateStr*/)).WillReturn(DateTime.Now.AddYears(2));
DecryptionServiceが偽造された最初の部分は機能し、社会保障やその他の機密性の高い文字列は「復号化」されますが、DateTimeにどのパラメーターを指定しても、例外が発生します(ArgumentNullException:文字列参照がオブジェクトのインスタンスに設定されていない場合DateStrがnull、 " * "の場合はFormatException )
無効なパラメーターが渡された有効なDateTimeを返すように、typemockでDateTime.Parseをオーバーライドするにはどうすればよいですか?