0

我需要一种使用 Typemock 伪造 DateTime.Parse 的方法,并让它在使用任何参数调用时返回相同的日期。

我有一个存储加密字符串的数据库字段,该字符串在加载时被解析为日期。保存数据的类有一个 Load() 方法,它将数据库数据复制到它的属性中,解密加密的内容并进行一些基本的验证,例如:

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 来解密数据之前,一切正常 - 它不起作用,因为我的开发机器没有加密过程中使用的数据库证书。我不能将它们放在我的机器上只是为了测试,那将是一个安全漏洞。

我将此添加到我的单元测试中:

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 为空,为“ * ”时出现 FormatException)

如何(如果)我可以用 typemock 覆盖 DateTime.Parse 以便它返回有效的 DateTime 并传递任何无效的参数?

4

1 回答 1

3

我的名字是 Nofar,来自 Typemock 的支持团队。

DateTime.Parse 在 WhenCalled API 中不受支持,因此为了伪造它的返回值,您需要使用类中的方法对其进行包装,例如:

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

于 2012-12-11T13:13:09.353 回答