Как я могу получить Pex для обработки функции, используя DateTime.Now или File.Exists
Я новичок в 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 ответ
Для этого и предназначен проект Moles. Это позволяет вам высмеивать практически все, включая встроенные статические функции, такие как DateTime.Now
,
Соответствующий код Moled будет выглядеть примерно так:
[PexMethod]
public string ConvertToLongStringWithGmtOffset(DateTime _cutOffData)
{
MDateTime.NowGet = () => /* some value */;
string result = CommonDateTime.ConvertToLongStringWithGmtOffset(_cutOffData);
return result;
}
Вот более длинный учебник, который на самом деле использует DateTime.Now
как его пример.