2017-01-04 7 views
9

मैं यूनिट परीक्षण सीखने की प्रक्रिया में हूं, हालांकि मैं समझने के लिए संघर्ष कर रहा हूं कि यूनिट परीक्षण के लिए फ़ंक्शंस कैसे करें। मैंने कई तरह के और उदाहरणों की समीक्षा की है लेकिन अवधारणा मेरे कोड पर इसका उपयोग करने के लिए पर्याप्त रूप से स्थानांतरित नहीं कर रही है। मैं उम्मीद कर रहा हूं कि यह एक वास्तविक कोड उदाहरण पर काम करने के लिए हो रहा है जो मैंने मदद की है।नकली xmlrpc.client विधि पायथन

इस मामले में मैं isTokenValid नकली करने की कोशिश कर रहा हूं।

यहां उदाहरण कोड है जो मैं नकल करना चाहता हूं।

<in library file> 

import xmlrpc.client as xmlrpclib 

class Library(object): 
    def function: 
     #... 
     AuthURL = 'https://example.com/xmlrpc/Auth' 
     auth_server = xmlrpclib.ServerProxy(AuthURL) 
     socket.setdefaulttimeout(20) 
     try: 
      if pull == 0: 
       valid = auth_server.isTokenValid(token) 
     #... 

मेरी इकाई परीक्षण फ़ाइल में मैं

import library 

class Tester(unittest.TestCase): 
    @patch('library.xmlrpclib.ServerProxy') 
    def test_xmlrpclib(self, fake_xmlrpclib): 
     assert 'something' 

मैं 'समारोह' में सूचीबद्ध कोड कैसे नकली होता है? टोकन एक स्ट्रिंग के रूप में किसी भी संख्या हो सकती है और वैध एक पूर्णांक होगा (1)

उत्तर

1

कई mock attributes उपयोग करने के लिए कर रहे हैं, और इस प्रकार एक छोटे से रूप में आप अपने पैच डेकोरेटर उपयोग बदल सकते हैं:

class Tester(unittest.TestCase): 
    def test_xmlrpclib(self): 
     with patch('library.xmlrpclib.ServerProxy.isTokenValid') as isTokenValid: 
      self.assertEqual(isTokenValid.call_count, 0) 
      # your test code calling xmlrpclib 
      self.assertEqual(isTokenValid.call_count, 1) 
      token = isTokenValid.call_args[0] # assume this token is valid 
      self.assertEqual(isTokenValid.return_value, 1) 

आप कर सकते हैं अपनी आवश्यकताओं को पूरा करने के लिए ऊपर दिए गए कोड को समायोजित करें।

4

सबसे पहले, आप xmlrpc.client.ServerProxy पर नकल कर सकते हैं और करना चाहिए; आपकी लाइब्रेरी xmlrpc.client को नए नाम के रूप में आयात करती है, लेकिन यह अभी भी वही मॉड्यूल ऑब्जेक्ट है, इसलिए आपकी लाइब्रेरी में xmlrpclib.ServerProxy और xmlrpc.client.ServerProxy एक ही ऑब्जेक्ट की ओर ले जाती है।

अगला, ऑब्जेक्ट का उपयोग कैसे किया जाता है, और पर कॉल करें, (..) वाक्यविन्यास। आपका पुस्तकालय इस तरह सर्वर प्रॉक्सी का उपयोग करता है:

# a call to create an instance 
auth_server = xmlrpclib.ServerProxy(AuthURL) 
# on the instance, a call to another method 
valid = auth_server.isTokenValid(token) 

तो वहाँ एक श्रृंखला यहाँ है, जहां नकली कहा जाता है, और वापसी मान फिर एक और विशेषता यह है कि यह भी कहा जाता है पता लगाने के लिए प्रयोग किया जाता है। मजाक करते समय, आपको उसी श्रृंखला की तलाश करनी होगी; इसके लिए Mock.return_value attribute का उपयोग करें। डिफ़ॉल्ट रूप से जब आप एक नकली कॉल करते हैं तो एक नया नकली उदाहरण लौटाया जाता है, लेकिन आप परीक्षण मान भी सेट कर सकते हैं।

तो अपने कोड का परीक्षण करने के लिए, आप auth_server.isTokenValid(token) रिटर्न पर प्रभाव डालना चाहते हैं, और परीक्षण करें कि आपका कोड सही तरीके से काम करता है या नहीं। आप यह भी कहना चाहेंगे कि सही यूआरएल ServerProxy उदाहरण में पास किया गया है।

विभिन्न परिणामों के लिए अलग-अलग परीक्षण बनाएं। शायद टोकन एक मामले में मान्य है, दूसरे में मान्य नहीं है, और आप दोनों मामलों का परीक्षण करना चाहते हैं:

class Tester(unittest.TestCase): 
    @patch('xmlrpc.client.ServerProxy') 
    def test_valid_token(self, mock_serverproxy): 
     # the ServerProxy(AuthURL) return value 
     mock_auth_server = mock_serverproxy.return_value 
     # configure a response for a valid token 
     mock_auth_server.isTokenValid.return_value = 1 

     # now run your library code 
     return_value = library.Library().function() 

     # and make test assertions 
     # about the server proxy 
     mock_serverproxy.assert_called_with('some_url') 
     # and about the auth_server.isTokenValid call 
     mock_auth_server.isTokenValid.assert_called_once() 
     # and if the result of the function is expected 
     self.assertEqual(return_value, 'expected return value') 

    @patch('xmlrpc.client.ServerProxy') 
    def test_invalid_token(self, mock_serverproxy): 
     # the ServerProxy(AuthURL) return value 
     mock_auth_server = mock_serverproxy.return_value 
     # configure a response; now testing for an invalid token instead 
     mock_auth_server.isTokenValid.return_value = 0 

     # now run your library code 
     return_value = library.Library().function() 

     # and make test assertions 
     # about the server proxy 
     mock_serverproxy.assert_called_with('some_url') 
     # and about the auth_server.isTokenValid call 
     mock_auth_server.isTokenValid.assert_called_once() 
     # and if the result of the function is expected 
     self.assertEqual(return_value, 'expected return value') 
संबंधित मुद्दे