2012-01-15 12 views
8

मेरे पास Currency कक्षा है जो मैं NHibernate का उपयोग करके अपने डेटाबेस में कायम रहता हूं। Currency वर्ग इस तरह दिखता है:एनयूनीट 2.5 में टेस्टकेस का उपयोग कैसे करें?

public class Currency : Entity 
{ 
    public virtual string Code { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Symbol { get; set; }   
} 

मैं [TestCase] इस तरह का उपयोग कर एक इकाई परीक्षण लिखा है:

[TestCase(6,Result = new Currency ({ Code="GBP", Name="British Pound", Symbol="£"}))] 
    public Currency CanGetCurrencyById(int id) 
    { 
     ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session); 
     Currency c = currencies.GetById<Currency>(id); 

     return c; 
    } 

मैं जानता हूँ कि यह गलत है लेकिन मुझे यकीन है कि यह कैसे लिखने के लिए नहीं कर रहा हूँ। क्या परिणाम object हो सकता है?

उत्तर

17

विशेषता तर्क (Result के लिए) निरंतर अभिव्यक्ति होना चाहिए। आप अब जैसी वस्तुओं को नहीं बना सकते हैं।

TestCase विशेषता का उपयोग उन मामलों के परीक्षण के लिए अच्छा है जहां आपको कई सरल इनपुट/आउटपुट सत्यापित करने की आवश्यकता है। - वे काफी अच्छा उदाहरण प्रदान

[TestCase(6, Result = "GBP")] 
[TestCase(7, Result = "USD")] 
[TestCase(8, Result = "CAD")] 
public string CanGetCurrencyById(int id) 
{ 
    ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session); 
    Currency c = currencies.GetById<Currency>(id); 

    return c.Code; 
} 

इसके अलावा, TestCase documentation पर एक नज़र डालें: अपने scenarion में, आप फिर भी (अर्थात, यदि आप केवल कि क्या इड-कोड मानचित्रण सत्यापित करने के लिए योजना बना रहे हैं) कुछ इस तरह कर सकते हैं ।

संपादित: मानचित्रण परीक्षण करके मैं पुष्टि करने के रूप में आप का इरादा है कि क्या आपकी ORM मैपिंग (NHibernate डेटाबेस के लिए) सही है और काम कर रहे हैं मतलब है। आप आम तौर पर परीक्षण है कि इस परिदृश्य में:

  1. पूर्वनिर्धारित मान (। जैसे Currency)
  2. प्रारंभ नई लेन-देन
  3. सहेजें इकाई (Save + Flush + Evict संयोजन के साथ नई इकाई इंस्टेंस बनाएं सुनिश्चित करने के लिए NHibernate नहीं है दुकान अब और कैश में इकाई बचाया) इकाई
  4. पुनः प्राप्त
  5. पूर्वनिर्धारित लोगों के साथ लिया गया मानों की तुलना करें
  6. रोलबैक लेनदेन

इस तरह के परीक्षण तो गुजरता है, यह कम या ज्यादा आपको बताता है कि मैं उन मूल्यों के साथ इस इकाई को बचा सकता है, और मैं तो बिल्कुल एक ही मूल्यों के साथ पुनः प्राप्त कर सकते हैं। और यह सब आप जानना चाहते थे - मैपिंग सही हैं।

TestCase विशेषता के साथ, संपूर्ण वस्तुओं की शुद्धता की पुष्टि करना काफी मुश्किल है - इसका मतलब सरल सामानों का परीक्षण करना है। आप अन्य उत्तर में सुझाए गए वर्कअराउंड का उपयोग कर सकते हैं (TestCase के माध्यम से तर्क पारित करना) लेकिन यह जल्दी से अपठनीय और बनाए रखने के लिए कठिन हो जाता है (सत्यापित करने के लिए 6+ गुणों वाली इकाई की कल्पना करें)।

मैं एक है कि पुष्टि करता है कि क्या code को id की मैपिंग सही है में अपने परीक्षण के बंटवारे का सुझाव (हालांकि मुझे लगता है कि ऐसा करने में थोड़ा बात देखते हैं, जब तक आप कुछ कोड को मैप किया कुछ आईडी के लिए हमेशा योजना) और अन्य एक की पुष्टि करने चाहे Currency इकाई डेटाबेस तालिका में ठीक से मैप की गई है।

+0

धन्यवाद, क्या आप समझा सकते हैं कि मैं एकाधिक ऑब्जेक्ट्स का परीक्षण कैसे कर सकता हूं? मैपिंग परीक्षण क्या है? –

+0

@ मार्क: मैपिंग टेस्ट करके आप सत्यापित करते हैं कि ओआरएम मैपिंग सही हैं (उदाहरण के लिए कि यदि आप 'डेटटाइम' प्रॉपर्टी सेट के साथ इकाई को सहेजते हैं, तो इसे किसी भी सूचना हानि के बिना मैप और सहेजा जाता है)। मेरा संपादन देखें। –

3

इस तरह के मामलों में मैं परीक्षण मामले में अपेक्षित परिणाम के लिए कन्स्ट्रक्टर तर्क पास करता हूं, और, स्वयं जांच करें। हालांकि यह संक्षेप में नहीं है, यह काम पूरा हो जाता है।

[TestCase(6, "GBP", "British Pound", "£")] 
public void CanGetCurrencyById(int id, string code, string name, string symbol) 
{ 
    ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session); 
    Currency c = currencies.GetById<Currency>(id); 
    Assert.That(c, Is.EqualTo(new Currency(code, name, symbol))); 
} 
संबंधित मुद्दे