Как я могу получить Pex для обработки функции, используя DateTime.Now или File.Exists - PullRequest
1 голос
/ 15 декабря 2011

Я новичок в Pex, и я не вижу, как использовать его с машинными процедурами, такими как DateTime.Now и File.Exists ().

У меня есть функция для отображения отключенияDateTime со смещением часового пояса.

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 Explorer

[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;
    }
}

Однако это генерирует тест, специфичный для машины -происходит сбой, когда машина находится в часовом поясе не по Гринвичу.

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 ().Или я могу сказать, чтобы он всегда как-то использовал определенный часовой пояс?

1 Ответ

3 голосов
/ 16 декабря 2011

Это то, для чего предназначен проект Moles .Он позволяет вам макетировать что угодно, включая встроенные статические функции, такие как DateTime.Now.

. Соответствующий код Moled будет выглядеть примерно так:

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

    string result = CommonDateTime.ConvertToLongStringWithGmtOffset(_cutOffData);
    return result;
}

Вотболее длинный учебник , который на самом деле использует DateTime.Now в качестве примера.

...