TypeMock伪造DateTime.Parse

时间:2012-12-10 20:57:02

标签: datetime typemock

我需要一种方法来使用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?

1 个答案:

答案 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支持