2012-08-03 13 views
8

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

नियंत्रक की कार्यप्रणाली परीक्षण/मजाक करने के तरीके में थोड़ी सी हो रही है। मैं xUnit और Moq का उपयोग कर रहा हूं, लेकिन उन दोनों के साथ रहना बिल्कुल जरूरी नहीं है।

आवेदन डेटाबेस का उपयोग से निपटने के लिए विशिष्ट वस्तुओं का उपयोग करता है, तो मैं controllerObject है और उसके contructor DataAccessObject

मैं नियंत्रक/dataaccess जोड़ी मजाक के साथ समस्या हो रही है की आवश्यकता है। पहला टेस्ट जिसे मैं चलाने की कोशिश कर रहा हूं वह GetAllFromDataBase है, लेकिन मुझे वास्तव में यह नहीं करना है कि इसे कैसे किया जाए।

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

मैं क्या चुओंग Le मुझसे कहा था और पूरे अब बढ़ रहा है था, मैं सच में यह apreciate। लेकिन मैं एक और समस्या में फंस गया। एपीआई तक पहुंचने के लिए, एक उपयोगकर्ता नाम/पासवर्ड जोड़ी है और मेरा नियंत्रक Thread.CurrentPrincipal.Identity.Name का उपयोग करता है; मुझे लगता है कि मुझे लगता है कि मुझे इस मूल्य को पूरी तरह से काम करने के लिए सेट करना होगा।

इसके अलावा valueServiceMock.Setup (service => service.GetValues ​​()) । पुनर्नवीनीकरण (नया [] {"value1", "value2"});

काम नहीं कर रहा प्रतीत होता है। चूंकि कोड डेटाबेस के लिए पहुंचने का प्रयास करता है, और कुछ भी नहीं मिलता है क्योंकि इसे

+0

आप नियंत्रक नकली नहीं करना चाहिए, आपका उपहास होगा सेवाओं को नियंत्रक की जरूरत है। यदि आप नियंत्रक का मज़ाक उड़ा रहे थे, तो आप नियंत्रक का परीक्षण नहीं करेंगे। यह पूरा मुद्दा है। इस पोस्ट पर एक नज़र डालें: http://www.peterprovost.org//blog/2012/06/16/unit-testing-asp-dot-net-web-api/ – tugberk

+0

क्या आपने जांच की है कि आप मॉक ऑब्जेक्ट को पास करते हैं इस तरह के निर्माता: var नियंत्रक = नए मूल्य नियंत्रक (valueServiceMock.Object); –

उत्तर

18

अपने ऐप को टेस्ट करने योग्य बनाने के लिए, आपको टेस्टेबिलिटी के लिए डिज़ाइन करने की आवश्यकता है। तकनीकी रूप से, टेस्टेबिलिटी के लिए डिज़ाइन करने के लिए , आपके ऐप को परतों, घटकों के बीच और कक्षाओं के बीच भी जितना संभव हो उतना ढीला युग्मन होना चाहिए।

टेस्टेबिलिटी के लिए डिज़ाइन करने के लिए बहुत सारे संकेत: सीलबंद, स्थैतिक वर्ग से बचें ... लेकिन सबसे लोकप्रिय चीज जिसे आपको अवगत कराने की आवश्यकता है dependency injection pattern, संरचनाओं या अन्य वस्तुओं के तरीकों के अंदर ऑब्जेक्ट बनाने के बजाय, इस ऑब्जेक्ट को चाहिए इंजेक्शन दिया जाना चाहिए। इस तरह हम कक्षा के बीच ढीली निर्भरता बनाते हैं और हमारे लिए आसान है नकली ढांचे का मज़ाक उड़ाकर। Esp, बाहरी संसाधनों पर निर्भर वस्तुओं के लिए: नेटवर्क, फ़ाइल या डेटाबेस।

निर्भरता इंजेक्शन का उपयोग करके वस्तु को इंजेक्ट कैसे करें: यही कारण है कि IocContainer इसके लिए सही उपकरण है, यह आपके लिए ऑब्जेक्ट्स को स्वचालित रूप से इंजेक्ट करेगा। आईओसी कंटेनर जो मैं उपयोग करना पसंद करता हूं वह है: Autofac और NInject

यहाँ

उदाहरण ValuesController में ValueService सुई:

public class ValuesController : ApiController 
{ 
    private readonly IValueService _valueService; 

    public ValuesController(IValueService valueService) 
    { 
     _valueService = valueService; 
    } 

    public string[] Get() 
    { 
     return _valueService.GetValues(); 
    } 

    public string Get(int id) 
    { 
     return _valueService.GetValue(id); 
    } 
} 

और नीचे Moq के साथ इकाई परीक्षण करने के लिए सरल कोड है:

var valueServiceMock = new Mock<IValueService>(); 
valueServiceMock.Setup(service => service.GetValues()) 
      .Returns(new[] { "value1", "value2" }); 

var controller = new ValuesController(valueServiceMock.Object); 
var values = controller.Get(); 

Assert.AreEqual(values.Length, 2); 
Assert.AreEqual(values[0], "value1"); 
Assert.AreEqual(values[1], "value2"); 
+0

मैंने जो किया आपने किया और अब पूरा हो रहा है, मैं वास्तव में इसकी प्रशंसा करता हूं। लेकिन मैं एक और समस्या में फंस गया। एपीआई तक पहुंचने के लिए, एक उपयोगकर्ता नाम/पासवर्ड जोड़ी है और मेरा नियंत्रक Thread.CurrentPrincipal.Identity का उपयोग करता है।नाम; – oSR

+0

मैं उम्मीद कर रहा था कि मैं इसे हल कर सकता हूं, लेकिन फिर एक और सवाल करने दो! – oSR

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