我需要一种方法来使用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:String reference not set to a instance of a如果DateStr为null,则为对象;当为“ * ”时为FormatException)
如何(if)可以使用typemock覆盖DateTime.Parse,以便它返回有效传递的无效参数的有效DateTime?
答案 0 :(得分:3)
我的名字是Nofar,我来自Typemock的支持团队。
WhenCalled API不支持DateTime.Parse,因此为了伪造它的返回值,您需要使用类中的方法将其包装起来,例如:
public class BusinessObject
{
public DateTime Load (string s)
{
return DateTime.Parse(s);
}
}
你的测试看起来像这样:
[TestMethod]
public void TestMethodDateTime()
{
BusinessObject b = new BusinessObject();
DateTime now= DateTime.Now.AddYears(2);
Isolate.WhenCalled(()=>b.Load(null)).WillReturn(now);
Assert.AreEqual(now, b.Load(null));
}
支持WhenCalled API中的DateTime.Parse在我们的待办事项中。
请随时通过support@typemock.com
邮件与我们联系Nofar Typemock支持