我如何让Pex使用DateTime处理函数.Now或File.Exists

本文关键字:Now 处理函数 File Exists DateTime 使用 Pex | 更新日期: 2023-09-27 18:18:09

我是Pex的新手,我不知道如何将它与机器特定的例程(如DateTime)一起使用。Now和File.Exists().

我有一个函数显示截止日期时间与时区偏移。

public class CommonDateTime
{
    public static string ConvertToLongStringWithGmtOffset(DateTime cutoffData)
    {
        return String.Format(
            "{0} {1} GMT (local time is {2})", 
            cutoffData.ToLongDateString(), 
            cutoffData.ToShortTimeString(), 
            DateTime.Now.ToString("zzz"), // here is the problem...
            CultureInfo.InvariantCulture);
    }
}

我有一个Pex参数化测试,它由Pex资源管理器生成

[PexClass(typeof(CommonDateTime))]
[TestFixture]
public partial class CommonDateTime_Test
{
    /// <summary>Test stub for ConvertToLongStringWithGmtOffset(DateTime)</summary>
    [PexMethod]
    public string ConvertToLongStringWithGmtOffset(DateTime _cutOffData)
    {
        string result = CommonDateTime.ConvertToLongStringWithGmtOffset(_cutOffData);
        return result;
    }
}

然而,这会生成一个特定于机器的测试——当机器处于非gmt时区时,它会失败。

public partial class CommonDateTime_Test
{
    [Test]
    [PexGeneratedBy(typeof(CommonDateTime_Test))]
    public void ConvertToLongStringWithGmtOffset156()
    {
        string s;
        s = this.ConvertToLongStringWithGmtOffset(default(DateTime));
        PexAssert.AreEqual<string>
            ("Monday, January 01, 0001 12:00 AM GMT (local time is +00:00)", s);
    }
}

在这种情况下我该怎么办?我可以告诉它跳过对引用函数(如DateTime)的函数的探索吗?Now或File.Exists()。或者我可以告诉它总是使用一个特定的时区?

我如何让Pex使用DateTime处理函数.Now或File.Exists

这就是mole项目的目的。它基本上可以模拟任何东西,包括内置的静态函数,如DateTime.Now

合适的'Moled'代码应该是这样的:

[PexMethod]
public string ConvertToLongStringWithGmtOffset(DateTime _cutOffData)
{
    MDateTime.NowGet = () => /* some value */;
    string result = CommonDateTime.ConvertToLongStringWithGmtOffset(_cutOffData);
    return result;
}

这里有一个更长的教程,实际上是用DateTime.Now为例。