ความชอบของฉันคือการมีคลาสที่ใช้เวลาจริงอาศัยอินเทอร์เฟซเช่น
interface IClock
{
DateTime Now { get; }
}
ด้วยการนำไปปฏิบัติอย่างเป็นรูปธรรม
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
จากนั้นหากคุณต้องการคุณสามารถจัดหานาฬิกาประเภทอื่น ๆ ที่คุณต้องการสำหรับการทดสอบได้เช่น
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
อาจมีค่าใช้จ่ายบางอย่างในการจัดหานาฬิกาให้กับคลาสที่อาศัยอยู่ แต่สามารถจัดการได้โดยใช้โซลูชันการฉีดแบบพึ่งพาจำนวนเท่าใดก็ได้ (โดยใช้คอนเทนเนอร์ Inversion of Control, คอนสตรัคเตอร์ / เซ็ตเตอร์แบบเก่าธรรมดาหรือแม้กระทั่งรูปแบบเกตเวย์แบบคงที่ )
กลไกอื่น ๆ ในการส่งมอบวัตถุหรือวิธีการที่ให้เวลาที่ต้องการก็ใช้ได้เช่นกัน แต่ฉันคิดว่าสิ่งสำคัญคือการหลีกเลี่ยงการรีเซ็ตนาฬิการะบบเนื่องจากจะทำให้เกิดความเจ็บปวดในระดับอื่น ๆ
นอกจากนี้การใช้DateTime.Now
และการรวมไว้ในการคำนวณของคุณไม่เพียง แต่รู้สึกไม่ถูกต้องเท่านั้น แต่ยังช่วยให้คุณสามารถทดสอบช่วงเวลาที่เฉพาะเจาะจงได้เช่นหากคุณพบข้อบกพร่องที่เกิดขึ้นใกล้เขตแดนเที่ยงคืนเท่านั้นหรือในวันอังคาร การใช้เวลาปัจจุบันจะไม่อนุญาตให้คุณทดสอบสถานการณ์เหล่านั้น หรืออย่างน้อยก็ไม่เมื่อใดก็ตามที่คุณต้องการ