2015-09-10 5 views
5

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

motor.py (मोटर्स चलाता है):: चलो दो फ़ाइलों के आयात पर विचार करें

from RPi import GPIO as gpio 

और client.py (सर्वर के साथ संचार और रिले मोटर्स के लिए आदेश):

from rpi.motor import Motor 

दोनों फ़ाइलों rpi नामक निर्देशिका में हैं, जिसमें __init__.py और __main__.py शामिल है। गैर-आरपीआई उपकरणों पर RPi पैकेज स्थापित नहीं किया जा सकता है। हालांकि, मैं अभी भी client.py की कार्यक्षमता का परीक्षण करना चाहता हूं।

import unittest 
from unittest import mock 
# Location A 


class TestClient(unittest.TestCase): 
    # Location B 
    setUp(self): 
     # Location C 
     pass 

मूल रूप से, मैं लोका पर from rpi.client import Client की कोशिश की, लेकिन वह विफल रहा क्योंकि यह आरपीआई, जो अस्तित्व में नहीं है से मोटर आयात करने के लिए, और फिर आयात GPIO की कोशिश की। मैं भी LocB (self के बाद mock_motor जोड़ने सहित कम से mock.patch("rpi.client.Motor") की कोशिश की, और LocC पर Client आयातित है, लेकिन यह रूप में अच्छी तरह विफल रहा है। मैं लोका पर RPi मजाक की कोशिश की है, भी, लेकिन यह या तो काम नहीं किया।

आप कैसे नकली है ?। बाहर एक पुस्तकालय जो आपके सिस्टम पर स्थापित नहीं है

+0

यदि पुस्तकालय केवल पीआई पर काम करता है, तो पीआई पर परीक्षण क्यों नहीं चलाते? तो आपको कुछ भी जटिल नहीं करना है। – davidism

+0

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

उत्तर

5

आप patch.dict() उपयोग कर सकते हैं sys.modules और नकली RPi मॉड्यूल पैच करने के लिए के रूप में उठाई दस्तावेज में दिखाया

उपयोग अपने परीक्षण मॉड्यूल के शीर्ष पर कोड का पालन करें:

>>> from mock import MagicMock, patch 
>>> mymodule = MagicMock() 
>>> patch.dict("sys.modules", RPi=mymodule).start() 
>>> from RPi import GPIO as gpio 
>>> gpio 
<MagicMock name='mock.GPIO' id='139664555819920'> 
>>> import os 
>>> os 
<module 'os' from '/usr/lib/python2.7/os.pyc'> 

पायथन 3 में आपके समान व्यवहार है।


अपने विशिष्ट मामले उपयोग patch.dict में थोड़ा overkill है; हो सकता है कि आप पैच संदर्भ और मूल स्थिति में सुधार न करें। तो आप sys.modules["RPi"] सेट करके इसे सरल बना सकते हैं:

>>> from unittest.mock import MagicMock 
>>> mymodule = MagicMock() 
>>> import sys 
>>> sys.modules["RPi"] = mymodule 
>>> from RPi import GPIO as gpio 
>>> gpio 
<MagicMock name='mock.GPIO' id='140511459454648'> 
>>> import os 
>>> os 
<module 'os' from '/usr/lib/python3.4/os.py'> 
+0

मैंने सत्यापित किया है कि यह एक सही समाधान है। उत्तर को बेहतर बनाने के लिए मैं sys.modules पर विस्तार करूंगा। – Dan

+0

जैसा कि आप https://docs.python.org/3/library/unittest.mock.html#patch-dict 'patch.dict() 'डिफ़ॉल्ट व्यवहार को मूल शब्दकोश को संरक्षित करते हैं और केवल नए मानों को इंजेक्ट करते हैं। वैसे भी मैंने इसे और अधिक स्पष्ट करने के लिए कुछ अन्य नोट्स के साथ अपना जवाब एकीकृत किया। –

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