2010-08-31 20 views
11

तो मूल रूप से मेरे पास एक डोमेन ऑब्जेक्ट और एक सामान्य भंडार है जो उस ऑब्जेक्ट के साथ सीआरयूडी संचालन कर सकता है।मैं एनयूनीट के साथ जेनेरिक बेसटेस्ट कैसे बना सकता हूं जिसे मैं प्राप्त कर सकता हूं और बेस रन से परीक्षण कर सकता हूं?

public interface IBaseRepository<T> where T : BaseEntity 
{ 
    void Add(T entity); 
    void Remove(T entity); 
    T ById(int id); 
    IEnumerable<T> All(); 
} 

तो मेरे पास इस इंटरफ़ेस के कई कार्यान्वयन हैं, प्रत्येक डोमेन ऑब्जेक्ट के लिए एक।

मैं कुछ एकीकरण परीक्षणों (nunit प्रयोग करके) और उस के लिए मैं समझ मैं एक BaseRepositoryTest बनाने चाहते हैं लिखने के लिए चाहते हैं - इस तरह:

public abstract class BaseRepositoryTests<T> where T : BaseEntity 
{ 
    public abstract IBaseRepository<T> GetRepository(); 
    public abstract T GetTestEntity(); 

    [Test] 
    public void AddWhenCallingAddsObjectToDatabase() 
    { 
     IBaseRepository<T> repository = GetRepository(); 
     T entity = GetTestEntity(); 

     repository.Add(entity); 
    } 
} 

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

मुझे बस इतना करना है कि वास्तविक परीक्षण स्थिरता सही है? इस तरह:

[TestFixture] 
public class FooRepositoryTests: BaseRepositoryTests<Foo> 
{ 
    public override IBaseRepository<Foo> GetRepository() 
    { 
     throw new NotImplementedException(); 
    } 

    public override Foo GetTestEntity() 
    { 
     throw new NotImplementedException(); 
    } 
} 

यह हो मुझे शुरू कर दिया और मुझे एक असफल परीक्षण के बाद से फेंक यह टूट जाएगा (मैं भी कोई भाग्य के साथ तरीकों को लागू करने की कोशिश की वास्तव में) देना चाहिए। लेकिन testrunners (दोनों nunits जीयूआई और resharpers परीक्षण धावक दोनों की कोशिश की) बस मेरे आधार परीक्षण को अनदेखा करें! यह दिखाता है और सब - लेकिन वापस अनदेखा के रूप में रिपोर्ट की।

तो मैं खुदाई का एक छोटा सा था ... NUnit TextFixtureAttribute आप आप किस तरह का परीक्षण कर रहे हैं तो मैं विशेषता

[TestFixture(typeof(Foo))] 

डालने की कोशिश की पहली तारीख को बेस और निर्दिष्ट कर सकते हैं कि यह संपत्ति है भी फू संस्करण। जब फू संस्करण पर रखा जाता है, तब भी यह आधार से परीक्षण को अनदेखा करता है, और जब मैं इसे आधार पर डालता हूं ... अच्छा यह लाल हो जाता है क्योंकि विधियां अपवाद फेंकता है, जो कि अच्छा होगा, सिवाय इसके कि जब मैं वास्तविक कार्यान्वयन करता हूं FooTests में, वे अभी भी काम नहीं करेंगे (स्पष्ट रूप से टेस्टफिक्चर विशेषता को दिया गया बेस टेस्ट कभी नहीं जानता कि कक्षाएं किस वर्ग से प्राप्त होती हैं, तो कार्यान्वयन को कैसे पता चल जाएगा)।

तो मैं क्या करने के लिए अटक गया हूँ? मैं बेस टेस्ट क्लास वर्चुअल में टेस्ट कर सकता हूं और फिर इसे FooBaseRepositoryTests में ओवरराइड कर सकता हूं, केवल आधार से कार्यान्वयन को कॉल करने के लिए, जो मुझे लगता है कि एक लंगड़ा समाधान है ...

और क्या करना है? क्या मैं कुछ भूल रहा हूँ? कृपया मदद करें, कोई ... :)

उत्तर

1

जब आप विभिन्न प्रकार के लिए इसका उपयोग करने के लिए स्थिरता वर्ग पर [TestFixture(typeof(Foo))] विशेषता का उपयोग कर रहे हैं; यह अमूर्त नहीं माना जाता है।

यदि फू फ़िक्स्चर पर उपयोग किया जाता है, तो वह वर्ग सामान्य होना चाहिए, और फू के लिए टाइप नहीं किया जाना चाहिए।

डॉक्स से:

[TestFixture] 
public class AbstractFixtureBase 
{ 
    ... 
} 

[TestFixture(typeof(string))] 
public class DerivedFixture<T> : AbstractFixtureBase 
{ 
    ... 
} 

http://www.nunit.org/index.php?p=testFixture&r=2.5.5

+0

मैं आपका पॉइंट देखता हूं, धन्यवाद :) यह मेरी समस्या को हल नहीं करता है, क्योंकि सारफिक्शनबेस ने ' "AddWhenCallingAddsObjectToDatabase()" के लिए तर्क प्राप्त करने में सक्षम होने के लिए, मुझे सभी व्युत्पन्न जुड़नारों के लिए लगभग समान कार्यान्वयन लिखने में सक्षम ... –

+0

मैं आपके उत्तर को सही के रूप में फ़्लैग कर रहा हूं। मुझे लगता है कि यह न्यूटिट के साथ संभव नहीं है, इसलिए यह वास्तव में मुझे दिखा रहा है कि एपीआई कैसे काम करता है। –

0

मैंने आपके उदाहरण की कोशिश नहीं की है, लेकिन यदि आप एक ही कक्षा में विशेषता परीक्षण और परीक्षण डालते हैं तो आप कोशिश कर सकते हैं। इसे बेस क्लास में रखने की भी कोशिश करें।

+0

मैंने दोनों वर्गों पर टेस्टफिक्स्चर और टेस्ट के कई संयोजनों का प्रयास किया, मैं ईमानदारी से सोचता हूं कि मैंने उन सभी को आजमाया है;) –

2

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

[TestFixture] 
public class AbstractRepositoryTests 
{ 
    protected IRepository _repository; 

    [SetUp] 
    public virtual void SetUp() 
    { 
     Assert.Ignore(); 
    } 

    [Test] 
    public void AddToRepository() 
    { 
     // Place logic using _repository here 
    } 
} 

मैं तो ओवरराइड मेरे वंश में सेटअप व्यवहार नहीं बल्कि सभी परीक्षणों अनदेखी की तुलना में एक भंडार वस्तु का दृष्टांत के लिए:

public class InMemoryRepositoryTests : AbstractRepositoryTests 
{ 
    [SetUp] 
    public override void SetUp() 
    { 
     _repository = new InMemoryRepository<string>(); 
    } 
} 

व्युत्पन्न वर्ग अपनी मूल परीक्षण के सभी ठीक से चलेंगे। इसके बारे में केवल थोड़ा गन्दा हिस्सा यह है कि बेस क्लास "अनदेखा" परीक्षणों का एक गुच्छा बनाता है, जो बहुत साफ नहीं है।

+5

यदि आप वास्तव में सार सारणी के रूप में सार RRositoryTests बनाते हैं तो आप अपना जीवन आसान बना देंगे। तब केवल इसके कार्यान्वयन को तत्काल किया जाएगा, और आपके पास बेस क्लास का मुद्दा नहीं होगा जो अनदेखा परीक्षणों का एक समूह बनायेगा। – kiprainey

संबंधित मुद्दे

 संबंधित मुद्दे