2010-02-17 12 views
7

पर निर्भर है मेरे पास यह विधि है जो वर्तमान तिथि पर निर्भर है। यह जांचता है कि आज सूर्य, सोम, मंगल या बुध है, तो यह भेजे गए सामानों के आगमन के लिए 5 दिनों का नेतृत्व समय देता है। यदि इसकी थुर, शुक्र या शनि तो सप्ताहांत के लिए यह 6 दिनों का लीड टाइम देता है।तर्क की जांच कैसे करें जो वर्तमान दिनांक

private DateTime GetEstimatedArrivalDate() 
{ 
    DateTime estimatedDate; 
    if (DateTime.Now.DayOfWeek >= DayOfWeek.Thursday) 
    { 
     estimatedDate = DateTime.Now.Date.AddDays(6); 
    } 
    else 
    { 
     estimatedDate = DateTime.Now.Date.AddDays(5); 
    } 
    return estimatedDate; 
} 

वास्तविक अनुमान तर्क अधिक जटिल है। मैंने इस प्रश्न के उद्देश्य के लिए इसे सरल बना दिया है। मेरा सवाल यह है कि मैं इस तरह की किसी चीज़ के लिए यूनिट टेस्ट कैसे लिखूं जो आज की तारीख पर निर्भर करता है?

+0

जवाब (लगभग) है साथ "मैं इस तरह की किसी चीज़ के लिए यूनिट टेस्ट कैसे लिखूं जो आज की तारीख पर निर्भर करता है?" मार्क के जवाब में निर्भरता इंजेक्शन का उपयोग करने के लिए विधि को दोबारा दोहराएं। –

उत्तर

17

आप एक पैरामीटर के रूप में वर्तमान दिनांक पारित करने के लिए की जरूरत है:

private DateTime GetEstimatedArrivalDate(DateTime currentDate) 
{ 
    DateTime estimatedDate; 
    if (currentDate.DayOfWeek >= DayOfWeek.Thursday) 
    { 
     estimatedDate = currentDate.AddDays(6); 
    } 
    else 
    { 
     estimatedDate = currentDate.AddDays(5); 
    } 
    return estimatedDate; 
} 

वास्तविक कोड में आप इसे इस तरह कहते हैं:

DateTime estimatedDate = GetEstimatedArrivalDate(DateTime.Now.Date); 

तो फिर तुम यह इस प्रकार का परीक्षण कर सकते हैं:

DateTime actual = GetEstimatedArrivalDate(new DateTime(2010, 2, 10)); 
DateTime expected = ...; 
// etc... 

ध्यान दें कि यह आपके प्रोग्राम में संभावित बग को भी ठीक करता है जहां तिथि लगातार कॉल के बीचमें बदल जाती है।

+0

मैंने अभी एक ही जवाब पोस्ट किया है। आपने मुझे गति से हराया :) – Romain

+0

आपके लिए तय किया गया है। पिछली लाइन के लिए –

+1

+1 ... –

0

ऐसा लगता है कि सीमित संख्या में ऐसे मामले हैं जिन पर आप उन्हें प्रत्येक का परीक्षण कर सकते हैं। विधि आज की तारीख पर निर्भर करती है, लेकिन आउटपुट केवल सप्ताह के दिन ही निर्भर करता है, और प्रत्येक तारीख में सप्ताह का दिन होता है।

0

आप एक प्रतिनिधि में पास कर सकते हैं जो सामान्य समय के दौरान डेटटाइम लौटाता है। और फिर अपने परीक्षण पास में एक अन्य प्रतिनिधि जो एक निश्चित तिथि देता है, और उस पर आधारित अपना परिणाम बताता है।

0

ऐसा करने का एक "सामान्य" तरीका वर्तमान प्रणाली की तारीख "नकली" है (जिसे कई तरीकों से किया जा सकता है) और फिर "ज्ञात" तिथियों पर अपने कोड का परीक्षण करें।

private DateTime GetEstimatedArrivalDate() 
{ 
    return GetEstimatedArrivalDate(DateTime.Now); 
} 

private DateTime GetEstimatedArrivalDate(DateTime forDate) 
{ 
    DateTime estimatedDate; 
    if (forDate.DayOfWeek >= DayOfWeek.Thursday) 
    { 
     estimatedDate = forDate.Date.AddDays(6); 
    } 
    else 
    { 
     estimatedDate = forDate.Date.AddDays(5); 
    } 
    return estimatedDate; 
} 

और फिर "तुरंत" तारीखों पर परीक्षण करने के लिए एक पैरामीटर के साथ विधि का उपयोग करें:

एक और दिलचस्प तरीका थोड़ा अपने कार्यान्वयन को बदलने के लिए है।

1

मैं विवादास्पद उत्तर दूंगा, इसका परीक्षण न करें।

तर्क छोटा है और इसकी शून्य निर्भरता है, मैं अच्छे कोड कवरेज में विश्वास करता हूं लेकिन जब यह वास्तविक लाभ के लिए जटिलता को बढ़ाता है।

+1

यह उचित लगता है, लेकिन यह बिल्कुल सही तरीका है जिसे मैं अप्रत्याशित रूप से बदलने की उम्मीद करता हूं। अगर कंपनी अपनी शिपिंग नीतियों को बदलती है, तो टायर सेवाओं की पेशकश शुरू करती है, या वाहक स्विच करती है। अब तकनीकी रूप से, आप इसे जटिल होने के बाद परीक्षण करना शुरू कर सकते हैं, लेकिन मुझे लगता है कि यह एप्लिकेशन में एक महत्वपूर्ण हिंग है, और यह परीक्षण के तहत होना चाहिए ताकि बिल्कुल हर कोई उस पल को जानता हो। शायद ज़रुरत पड़े। – jcdyer

+0

बह। क्या होगा यदि हम सप्ताह के दौरान गुरुवार और शुक्रवार की स्थिति स्वैप करने का फैसला करते हैं? आप कभी नहीं जानते थे कि यह कोड टूटा हुआ था * जब तक कि यह बहुत देर हो चुकी थी! * और यदि हम गिनती दिनों * पिछड़े * शुरू करने का निर्णय लेते हैं, तो, मुझे यह भी नहीं पता कि * क्या * आपको बता सकता है कि क्या आप मुझे एक चमकदार लाल "परीक्षण विफल" प्रकाश नहीं दिखाओ। ;) – Aaronaught

+0

मैं अन्य टिप्पणीकारों से सहमत हूं। इस विधि में तर्क वास्तव में गैर-परीक्षण है। मैंने इसे अपने प्रश्न के लिए एक उदाहरण के रूप में दिखाने के प्रयोजनों के लिए सरल बना दिया। मैं इसे पूरी तरह से परीक्षण करना चाहता हूं। –

9

सामान्य शब्दों में, आप चाहते हैं सार के लिए एक इंटरफेस के पीछे वर्तमान दिनांक और समय प्राप्त करने की विधि चाहते हैं, उदाहरण के लिए:

public interface IDateTimeProvider 
{ 
    DateTime Now { get; } 
} 

असली सेवा होगा:

public class DateTimeProvider: IDateTimeProvider 
{ 
    public DateTime Now 
    { 
     get 
     { 
      return DateTime.Now; 
     } 
    } 
} 

और एक परीक्षण सेवा होगी:

public class TestDateTimeProvider: IDateTimeProvider 
{ 
    private DateTime timeToProvide; 
    public TestDateTimeProvider(DateTime timeToProvide) 
    { 
     this.timeToProvide = timeToProvide; 
    } 

    public DateTime Now 
    { 
     get 
     { 
      return timeToProvide; 
     } 
    } 
} 

उन सेवाओं के लिए जिन्हें वर्तमान समय की आवश्यकता है, उन्हें एक आईडीए लें एक निर्भरता के रूप में teTimeProvider। असली चीज़ के लिए, एक नया डेटटाइमप्रोवाइडर() पास करें; जब आप एक घटक होते हैं, तो एक नए TestDateTimeProvider (timeToTestFor) में पास करें।

+1

मैं इसे एक बिल्कुल 1 दाएं देता हूं, लेकिन एक ही समय में मुझे लगता है कि यह एक परीक्षण विधि के परीक्षण के लिए शीर्ष पर थोड़ा सा है। हालांकि मैं कवरेज के लिए आपके समर्पण की प्रशंसा करता हूं, और अगर मैं बहुत सारी विधियों या परीक्षण की आवश्यकता वाले कुछ जटिल तरीके थे तो शायद मैं इसे अपनाना चाहूंगा :) –

+0

अब यह छोटा हो सकता है, लेकिन चीजें आसानी से बदल सकती हैं। वैसे भी, +1 के रूप में मैं निश्चित रूप से परीक्षण सक्षम करने के लिए डेटटाइम कक्षाओं के आसपास एक एडाप्टर बनाना होगा। इसके अलावा, एक टीडीडीर के लिए, यह सामान्य मार्ग होगा। – Finglas

+0

एक तरफ ध्यान दें, क्या "परीक्षण सेवा" बनाने के बजाए एक मॉकिंग फ्रेमवर्क का उपयोग करना बेहतर नहीं होगा, जिसे अब आपको बनाए रखने की आवश्यकता है? यह थोड़ा unnessersary लगता है? –

2

अपनी कक्षा

class FakeClock : IClock 
{ 
    DateTime Now { get; set } 
} 

परीक्षण और एक वास्तविक कार्यान्वयन समय के आराम के लिए एक IClock पैरामीटर (निर्माता या संपत्ति के माध्यम से)

interface IClock 
{ 
    DateTime Now { get; } 
} 

फिर आप एक नकली कार्यान्वयन का उपयोग कर सकते हैं।

class SystemClock : IClock 
{ 
    DateTime Now { get { return DateTime.Now; } } 
} 
0

मैं Mark suggests के रूप में यह कर सुझाव है, लेकिन उत्पादन प्रयोग के लिए एक अतिभारित कॉल के अलावा है कि प्रश्न में कोई पैरामीटर लेता है और का उपयोग करता है DateTime.Now

private DateTime GetEstimatedArrivalDate() 
{ 
    return GetEstimatedArrivalDate(DateTime.Now); 
} 

private DateTime GetEstimatedArrivalDate(DateTime currentDate) 
{ 
    DateTime estimatedDate; 
    if (currentDate.DayOfWeek >= DayOfWeek.Thursday) 
    { 
     estimatedDate = currentDate.AddDays(6); 
    } 
    else 
    { 
     estimatedDate = currentDate.AddDays(5); 
    } 
    return estimatedDate; 
} 
संबंधित मुद्दे