2012-05-02 16 views
5

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

मुझे इस तरह के सभी प्रश्न/लेख मिल गए हैं: Unit testing RavenDb queries मुझे बताएं कि मुझे इसे याद करने के बजाय स्मृति में RavenDB का उपयोग करना चाहिए, लेकिन मुझे यह कैसे किया जाता है इसका एक ठोस उदाहरण नहीं मिल रहा है।

उदाहरण के लिए मैं डेटाबेस के लिए एक कर्मचारी को जोड़ने के लिए एक नियंत्रक कार्रवाई की है (हाँ, यह बहुत ज्यादा सरल है, लेकिन मैं इस मुद्दे को जटिल नहीं करना चाहती)

public class EmployeesController : Controller 
{ 

    IDocumentStore _documentStore; 
    private IDocumentSession _session; 

    public EmployeesController(IDocumentStore documentStore) 
    { 
    this._documentStore = documentStore; 

    } 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    _session = _documentStore.OpenSession("StaffDirectory"); 
    } 

    protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (_session != null && filterContext.Exception == null) { 
     _session.SaveChanges(); 
     _session.Dispose(); 
    } 
    } 

    [HttpGet] 
    public ViewResult Create() 
    { 
    return View(); 
    } 

    [HttpPost] 
    public RedirectToRouteResult Create(Employee emp) 
    { 
    ValidateModel(emp); 
    _session.Store(emp); 
    return RedirectToAction("Index"); 
    } 

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

यदि मैं मायने रखता हूं तो मैं एमएसटीएस्ट का उपयोग कर रहा हूं लेकिन मुझे अन्य ढांचे से परीक्षणों का प्रयास करने और अनुवाद करने में खुशी है।

धन्यवाद।

संपादित

ठीक है, अपने परीक्षण आरंभ दस्तावेज़ की दुकान है कि नियंत्रक निर्माता में इंजेक्ट किया जाता बनाता है, लेकिन जब मैं अपने परीक्षण चलाने OnActionExecuting घटना नहीं चलता है तो वहाँ का उपयोग करने के लिए कोई सत्र है और परीक्षण में विफल रहता है एक शून्य संदर्भ अपवाद के साथ।

[TestClass] 
public class EmployeesControllerTests 
{ 
    IDocumentStore _store; 

    [TestInitialize] 
    public void InitialiseTest() 
    { 
    _store = new EmbeddableDocumentStore 
    { 
     RunInMemory = true 
    }; 
    _store.Initialize(); 
    } 

    [TestMethod] 
    public void CreateInsertsANewEmployeeIntoTheDocumentStore() 
    { 
    Employee newEmp = new Employee() { FirstName = "Test", Surname = "User" }; 

    var target = new EmployeesController(_store); 
    ControllerUtilities.SetUpControllerContext(target, "testUser", "Test User", null); 

    RedirectToRouteResult actual = target.Create(newEmp); 
    Assert.AreEqual("Index", actual.RouteName); 

    // verify employee was successfully added to the database. 
    } 
} 

मुझे क्या याद आ रही है? परीक्षण में उपयोग करने के लिए बनाए गए सत्र को मैं कैसे प्राप्त करूं?

+0

मैं अपने प्रश्न को नवीनीकृत किया है, यही कारण है कि –

उत्तर

7

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

var newDoc = session.Load<T>(docId) 

या

var docs = session.Query<T>.Where(....).ToList(); 

RavenDB में स्मृति मोड है ताकि आप इसे बाहर नकली की जरूरत नहीं है, तो आप सिर्फ निम्न कार्य करें:

  • ओपन में एक नया -मेमरी एम्बेडेड डॉक स्टोर (बिना डेटा के)
  • यदि आवश्यक हो तो किसी भी डेटा को आपके यूनिट परीक्षण को
  • चलाने की आवश्यकता है ई इकाई परीक्षण
  • में स्मृति की दुकान में डेटा को देखने और देखें कि क्या यह सही ढंग से

अद्यतन अद्यतन किया गया है आप एक पूर्ण नमूना चाहते हैं, कैसे RacoonBlog कोड यह करता है पर एक नज़र , यह कोड Ayende's blog चल रहा है। इन 2 फ़ाइलें देखें:

+0

हाँ, मैं एक और पूरा उदाहरण ढूंढ रहा था क्योंकि मुझे अब तक मिल गया है :) और जानकारी के लिए मेरा प्रश्न देखें। – Nick

1

जैसा कि आपने धागे से जुड़े धागे को RavenDB एम्बेड करके एंबेडेबल डॉक्यूमेंटस्टोर का उपयोग किया है।

यहाँ कि कैसे सेट किया है: http://msdn.microsoft.com/en-us/magazine/hh547101.aspx

यहाँ कैसे काला कौआ साथ भंडार पैटर्न का उपयोग करने के लिए है, तो आप आसानी से परीक्षण कर सकते हैं: http://novuscraft.com/blog/ravendb-and-the-repository-pattern

3

इस बात की पुष्टि कर सकते हैं कैसे क्या के लिए जोड़ा गया एक इकाई परीक्षण में डेटाबेस?

आप नहीं करते हैं। हम यूनिट परीक्षणों में ऐसी चीजों का परीक्षण नहीं करते हैं। यह एकीकरण परीक्षण की जिम्मेदारी है, इकाई परीक्षण नहीं।

यदि आप यूनिट परीक्षण कक्षाएं चाहते हैं, जो कुछ बाहरी स्रोत (जैसे आपके डीबी) पर निर्भर करते हैं, तो डेटाबेस पहुंच का नकल करें।

संपादित करें:

कुछ उल्लेख किया गलतियों को सही करने के लिए, मैं MSDN से परिभाषा उद्धृत करता हूँ (हालांकि सभी अन्य संसाधनों के साथ सहमत):

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

मजाक किए बिना आप इकाई परीक्षण के बुनियादी सिद्धांतों को अनदेखा कर रहे हैं - अलगाव और संभवत: सबसे छोटे टुकड़े का परीक्षण करना।यूनिट परीक्षण को लगातार अज्ञान होना चाहिए और कुछ बाहरी वर्ग पर भरोसा नहीं करना चाहिए। क्या होगा यदि समय के साथ डीबी बदलता है? सभी परीक्षणों को फिर से लिखें, भले ही कार्यक्षमता बिल्कुल वही रहती है?

चालू करें। आप मुझे -1 दे सकते हैं कि आप कितनी बार चाहते हैं, लेकिन इससे आपको सही नहीं लगेगा।

+2

सच है नीचे देखते हैं, लेकिन RavenDB के नि: स्मृति मोड यह इतना एकीकरण परीक्षण करने के लिए आसान बनाता है , कि आपको अक्सर यूनिट परीक्षण करने और –

+1

@MattWarren, हम्म, और मैंने सोचा कि हम लगातार अनजान होने के लिए परीक्षण लिख रहे थे ... यह सवाल नहीं है कि यह आसान है या नहीं । यूनिट परीक्षण कक्षा सीमाओं के बाहर कभी नहीं जाना चाहिए, अन्यथा यह एकीकरण परीक्षण होगा। इससे कोई फ़र्क नहीं पड़ता कि आपके पास स्मृति में, फ़ाइल में, या पूरी तरह से अलग सर्वर पर आपका डीबी है या नहीं। सिद्धांत वही रहता है जो मुझे डरता है ... – walther

+0

आमतौर पर एसक्यूएल सर्वर जैसे आरडीबीएमएस के साथ मेरे पास एक संग्रह होगा और इन परीक्षणों के लिए इसका मज़ाक उड़ाएगा। हालांकि, मैंने ऑवेन्डे के ब्लॉग समेत रावेनडीबी पर पढ़े गए सभी लेखों का कहना है कि ऐसा नहीं करते .... इसलिए मैंने सोचा कि मैं इसे आजमाउंगा। – Nick

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