2013-10-14 6 views
5

इसलिए मैं अपने एमवीसी 4 एप्लिकेशन के लिए परीक्षण लिख रहा हूं और मैं विशेष रूप से नियंत्रक क्रियाओं का परीक्षण कर रहा हूं। जैसा कि मैंने शीर्षक में उल्लेख किया है, टेस्ट डेटा लौटने के बजाय परीक्षण अभी भी सेवा (डब्ल्यूसीएफ) को हिट करता है। मैं इस नियंत्रक है:मॉक ऑब्जेक्ट अभी भी सेवा करने के लिए कॉल कर रहा है

public class FormController : Controller 
{ 
    public SurveyServiceClient Service { get; set; } 
    public SurveyDao Dao { get; set; } 

    public FormController(SurveyServiceClient service = null, SurveyDao dao = null) 
    { 
     this.Service = service ?? new SurveyServiceClient(); 
     this.Dao = dao ?? new SurveyDao(Service); 
    } 

    // 
    // GET: /Form/ 

    public ActionResult Index() 
    { 
     var formsList = new List<FormDataTransformContainer>(); 
     Dao.GetForms().ForEach(form => formsList.Add(form.ToContainer())); 

     var model = new IndexViewModel(){forms = formsList}; 
     return View("Index", model); 
    } 

और यह इस डीएओ वस्तु का उपयोग करता है:

public class SurveyDao 
{ 
    private readonly SurveyServiceClient _service; 
    private readonly string _authKey; 

    public SurveyDao(SurveyServiceClient serviceClient) 
    { 
     _service = serviceClient; 
    } 

    .... 

    public FormContract[] GetForms() 
    { 
     var forms = _service.RetrieveAllForms(); 
     return forms; 
    } 

और यह अपने परीक्षण JustMock, GetForms पर नकली() एक सहायक कक्षा में कुछ परीक्षण डाटा रिटर्न उपयोग कर रहा है:

[TestClass] 
public class FormControllerTest 
{ 
    private SurveyDao mockDao; 
    private SurveyServiceClient mockClient; 

    public FormControllerTest() 
    { 
     mockClient = Mock.Create<SurveyServiceClient>(); 
     mockDao = Mock.Create<SurveyDao>(mockClient); 
    } 

    [TestMethod] 
    public void TestIndexAction() 
    { 
     //Arrange 
     var controller = new FormController(mockClient, mockDao); 
     Mock.Arrange(() => mockDao.GetForms()).Returns(TestHelpers.FormContractArrayHelper); 

     //Act 
     var result = controller.Index() as ViewResult; 

     //Assert 
     Assert.IsInstanceOfType(result.Model, typeof(IndexViewModel)); 
    } 
} 

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

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

मैं परीक्षण निर्माता एक [TestInitialize] समारोह होने के लिए बदल दिया है, तो टेस्ट अब इस तरह दिखता है:

[TestClass] 
public class FormControllerTest 
{ 
    private SurveyDao mockDao; 
    private SurveyServiceClient mockClient; 

    [TestInitialize] 
    public void Initialize() 
    { 
     mockClient = Mock.Create<SurveyServiceClient>(); 
     mockDao = Mock.Create<SurveyDao>(Behavior.Strict); 
    } 

    [TestMethod] 
    public void TestIndexAction() 
    { 
     //Arrange 
     var controller = new FormController(mockClient, mockDao); 
     Mock.Arrange(() => mockDao.GetForms()).Returns(TestHelpers.FormContractArrayHelper); 

     //Act 
     var result = controller.Index() as ViewResult; 

     //Assert 
     Assert.IsInstanceOfType(result.Model, typeof(IndexViewModel)); 
    } 
} 
+1

GetForms वर्चुअल विधि नहीं होना चाहिए? – rla4

+0

@ rla4, आप ऐसा क्यों कहते हैं? मॉक किए गए तरीकों को वर्चुअल होने की आवश्यकता है? – mam8cc

+1

यह निर्भर करता है। मैं जस्टमैक से परिचित नहीं हूं, लेकिन कई मॉकिंग फ्रेमवर्क डायनेमिक्स प्रॉक्सीइंग पर भरोसा करते हैं, जिन्हें वर्चुअल विधियों की आवश्यकता हो सकती है :) – rla4

उत्तर

3

कृपया सत्यापित करें कि आप JustMock के लिए सही असेंबली का उपयोग कर रहे हैं। कुछ अलग-अलग हैं (विजुअलबासिक, सिल्वरलाइट, जस्टमैक)।जस्टमैक एक वह है जिसे आप अपनी परियोजना में शामिल करना चाहिए।

सही व्यक्ति को शामिल करने में विफलता उस व्यवहार का कारण बनती है जिसका आप वर्णन कर रहे हैं (विधि ठीक तरह से स्टब नहीं किया जा रहा है)।

1

JustMock manual बताते हैं (मेरे द्वारा डाला) :

करके डिफ़ॉल्ट Telerik JustMock ढीला mocks का उपयोग करता है और आप +०१२३५१६४१०६ कॉल करने के लिए अनुमति देता है किसी दिए गए प्रकार परकिसी भी विधि पर। कोई फर्क नहीं पड़ता चाहे विधि कॉल व्यवस्थित है या नहीं, आप इसे कॉल करने में सक्षम हैं।

जब आप की Create() विधि मॉक बुला इस व्यवहार को नियंत्रित कर सकते हैं:

var foo = Mock.Create<IFoo>(Behavior.Strict); 

वहाँ आप क्या नकली वस्तु आप स्पष्ट रूप से एक निश्चित विधि लागू नहीं किया है, तो क्या करना चाहिए निर्दिष्ट कर सकते हैं। आपके मामले में (मुझे लगता है कि यह डिफ़ॉल्ट व्यवहार है) नकली वास्तव में उस वस्तु पर मूल विधि को कॉल करती है जिसे आप नकल करना चाहते हैं।

आप Behavior Enumeration गणन में निम्नलिखित विकल्प हैं:

  • ढीला: निर्दिष्ट करता है कि डिफ़ॉल्ट रूप से नकली कॉल जब तक स्पष्ट सेटअप, एक ठूंठ की तरह व्यवहार करेगा।
  • रिकर्सिवलोस: निर्दिष्ट करता है कि डिफ़ॉल्ट रूप से नकली कॉल माक ऑब्जेक्ट्स लौटाएंगे, जब तक कि स्पष्ट रूप से सेटअप न हो जाए।
  • सख्त: निर्दिष्ट करता है कि नकली पर किए गए किसी भी कॉल में अपवाद फेंक दिया जाएगा यदि अन्वेषण से सेट नहीं किया गया है।
  • कॉलऑरिगिनल: निर्दिष्ट करता है कि डिफ़ॉल्ट रूप से नकली पर किए गए सभी कॉल इसके संबंधित मूल सदस्य को तब तक बुलाएंगे जब तक कि कुछ निष्पादन सेट न हो जाएं।
+0

मैंने नकली व्यवहार करने के लिए नकली को संशोधित किया और सेवा अभी भी बुलाई जा रही है। 'mockDao = mock.Create (व्यवहार। Strict);' – mam8cc

+1

@ mam8cc: एक ['[testInitialize()]'] (http://msdn.microsoft.com/en-us/library/microsoft जोड़ने का प्रयास करें .visualstudio.testtools.unittesting.testinitializeattribute.aspx) विधि 'फॉर्मकंट्रोलरटेस्ट()' कन्स्ट्रक्टर के बजाय 'mockClient' और' mockDao' की अस्थिरता को स्थानांतरित करें। क्या इससे कुछ अन्तर पड़ता है? –

+0

कोई दुख की बात नहीं है, यह नहीं है। वही परिणाम थोड़ी सी अतिरिक्त जानकारी के रूप में, मैंने डिबगिंग के माध्यम से सत्यापित किया है कि सर्वेदाओ को एक मॉक पर सेट किया जा रहा है, बस यह सुनिश्चित करने के लिए। – mam8cc

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