2013-06-04 7 views
16

का उपयोग कर रहा सामान्य रूप में परीक्षण इसलिए यहाँ परीक्षण करते हैं कैसे पता करूं कि अनुरोध पर स्थिति संपत्ति Moq का उपयोग कर स्थापित किया गया है मेरी noobish प्र है Moq करने के लिए नया हूँ और?चेक एक संपत्ति स्थापित किया गया था, तो - Moq

public class DudeManager 
{ 
     private readonly IDRepository _repo; 

     public DManager(IDRepository repo) 
     { 
      _repo = repo; 
     } 

     public void Create(Request r) 
     { 
      r.Status = Status.Submitted; 
      _repo.AddRequest(r); 
     } 
} 

क्या निम्न से बेहतर दृष्टिकोण है? शायद VerifySet का उपयोग कर?

 [TestMethod] 
     public void AddingNewRequestSetsStatusToSubmitted() 
     { 
      //Arrange 
      var mock = new Mock<IDRepository>(); 
      var mockRequest = new Mock<Request>(); 
      var dManager = new DManager(mock.Object); 

      //Act 
      dManager.Create(mockRequest.Object); 

      //Assert 
      Assert.AreEqual(Status.Submitted, mockRequest.Object.Status); 
     } 

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

//Arrange 
var request = new Request(); 
var mock = new Mock<IDRepository>(); 
var dManager = new DManager(mock.Object); 
mock.Setup(x => x.AddRequest(It.IsAny<Request>())); 

//Act 
dManager.QueueNewRequest(request); 

//Assert 
Assert.AreEqual(RequestStatus.Submitted, request.Status); 

यह दृष्टिकोण मेरे लिए सही लगता है: यह दृष्टिकोण मैं सभी उपयोगी सुझाव के बाद का उपयोग कर समाप्त हो गया है। क्या कोई अन्यथा सोचता है?

+0

मेरा मानना ​​है कि VerifySet सबसे अच्छा फिट है। – neontapir

+0

क्या आप मुझे इसका उपयोग करने के तरीके पर एक उदाहरण दिखा सकते हैं? मैंने VerifySet का उपयोग करने की कोशिश की लेकिन यह मुझ पर उड़ा। –

+0

मुझे विश्वास नहीं है VerifySet कुछ भी करता है, मैं कभी भी इसके साथ परीक्षण में असफल रहा हूं, हमेशा गुजरता हूं। मैं डीबगर से गुजरता हूं और देखता हूं कि मेरा मॉक कॉलबस सच है, सवाल में संपत्ति शून्य है, कोई चालान नहीं है। एक नमस्ते "हैलो दुनिया" के साथ VerifySet और बात जाती है ... पास। मैं इकाई परीक्षण ढांचे के साथ जाऊंगा और इसे बराबर मानता हूं। –

उत्तर

25

मुझे लगता है कि VerifySet सही दृष्टिकोण है। यह कुछ इस तरह दिखेगा:

//Arrange 
var mock = new Mock<IDRepository>(); 
var mockRequest = new Mock<Request>(); 
// TODO: set some expectations here 

var dManager = new DManager(mock.Object); 

//Act 
dManager.Create(mockRequest.Object); 

//Assert 
mockRequest.VerifySet(x => x.Status = Status.Submitted); 

अपने मामले में मेरा मानना ​​है कि, यह चल रही है क्योंकि आप अपने अनुरोध नकली स्थिति पर सेट आपरेशन को संभालने के लिए सेट नहीं किया है।

एक आसान तरीका है कि ऐसा करने के लिए SetupAllProperties उपयोग कर रहा है, इसलिए जैसे:

//Arrange 
var mock = new Mock<IDRepository>(); 
var mockRequest = new Mock<Request>(); 
mockRequest.SetupAllProperties(); 
+0

यह अभी भी निम्न त्रुटि के साथ विफल रहता है: परीक्षण परिणाम: \t असफल अपवाद फेंक दिया: सिस्टम। ऑर्ग्यूमेंट अपवाद: गैर-आभासी (वीबी में अतिरंजित) सदस्य पर अवैध सेटअप: –

+1

बेशक, अनुरोध आपके मामले में एक इंटरफ़ेस नहीं है । काम करने के लिए आपको स्टेटस प्रॉपर्टी को वर्चुअल के रूप में चिह्नित करना होगा। और, जैसा कि नीचे दिए गए @ एडीनेट ने बताया है, जब तक कि अनुरोध में कुछ जटिल व्यवहार न हो, तो इसे नकल करने की कोई आवश्यकता नहीं है। – neontapir

+0

Ufuk Hacıoğulları द्वारा अन्य उत्तर भी काम किया, लेकिन मैंने इस संस्करण को मॉक किए गए अनुरोध ऑब्जेक्ट के बिना संशोधित किया। मुझे अनुरोध ऑब्जेक्ट का मज़ाक उड़ाते हुए और फिर आर्टर्ट क्लास का उपयोग करने के विचार को पसंद नहीं आया यह जांचने के लिए कि यह बराबर है या नहीं - यह सुनिश्चित नहीं है कि यह सही तरीका है लेकिन यह मेरे लिए सही लगता है (मेरे संशोधित/कामकाजी संस्करण को दिखाने के लिए पोस्ट संपादित करें। टिप्पणी करें कि यह एक बुरा अभ्यास है। –

5

मुझे लगता है कि आप डिफ़ॉल्ट रूप से सख्त व्यवहार का उपयोग करना चाहिए, तो आप एक कॉल के साथ सत्यापन कर सकते हैं। यह आपको अपना परीक्षण अधिक स्पष्ट रूप से लिखता है।

[TestMethod] 
public void AddingNewRequestSetsStatusToSubmitted() 
{ 
    //Arrange 
    var mock = new Mock<IDRepository>(MockBehavior.Strict); 
    var mockRequest = new Mock<Request>(MockBehavior.Strict); 
    var dManager = new DManager(mock.Object); 

    mockRequest.SetupSet(item => item.Status = It.IsAny<StatusType>()) 
       .Verifiable(); 

    //Act 
    dManager.Create(mockRequest.Object); 

    //Assert 
    Assert.AreEqual(mockRequest.Object.Status, Status.Submitted); 
    mock.VerifyAll(); 
    mockRequest.VerifyAll(); 
} 
4
mock.Verify(m=>m.AddRequest(It.Is<Request>(r=>r.Status == expectedStatus))); 

आप सत्यापित कर सकते हैं कि AddRequest विधि पैरामीटर (Request) के साथ बुलाया जाता है जो सही Status है। साथ ही, Request ऑब्जेक्ट का मज़ाक उड़ाकर वास्तव में यहां आवश्यक नहीं है।

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