2013-05-13 7 views
5

कुछ पायथन कोड है जो लिनक्स के तहत काम करता है। ऐसा एक तरह से लोक निर्माण विभाग के मॉड्यूल का उपयोग करता है:पाइथन बिल्टिन पीडब्ल्यूडी मॉड्यूल को कैसे छाया करें

import pwd 
    ... 
    def func(): 
     user=pwd.getpwnam(user)[2] 

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

इस समस्या को हल करने का मूल विचार परीक्षण चलाने के दौरान पीडब्ल्यूडी मॉड्यूल को छाया करना था। तो परीक्षण चलते समय, स्टब छाया pwd छाया करेगा और मुख्य प्रोग्राम चलाते समय, मूल (यूनिक्स) pwd का उपयोग किया जाएगा। हम परीक्षण PYTHONPATH पर इस तरह के ठूंठ बनाया:

# pwd.py 
def getpwnam(user): 
    print("YESSSSSSSS") 

लेकिन यह एक लोक निर्माण विभाग मॉड्यूल परछाई, एक डिबगर हम देखते हैं कि निर्मित pwd आयात किया जाता है में नहीं लगता है। मैं मुख्य रूप से जावा डेवलपर हूं, इसलिए मुझे खेद है कि चीजों को करने का तरीका "पायथनिक" नहीं है। विचारों का स्वागत है।

उत्तर

9

जैसे किसी अन्य चीज़ के लिए अपने pwd.py का नाम बदलें। तब का उपयोग करें:

try: 
    import pwd 
except ImportError: 
    import winpwd as pwd 

pwd इस तरह से आयात करके आप मिल जाएगा निर्मित pwd लिनक्स पर, और winpwd विंडोज पर। फिर आप परीक्षण चलाने में सक्षम होना चाहिए और कृपया इसे मजाक कर सकते हैं।

+0

उत्कृष्ट उत्तर, बस हमें क्या चाहिए! – Dmitriusan

+0

आप Winpwd कैसे स्थापित करना चाहते हैं? पीआईपी ने इसे अनुक्रमित नहीं किया है, और एक Google खोज अजीब चीजें पाती है। – syonip

+0

मुझे यह वही समस्या है। – Locane

4
import os 
if os.name == 'nt': 
    class Pwd(): 
     def getpwnam(self, user): 
      pass 
    pwd = Pwd() 
else: 
    import pwd 

कुछ ऐसा ही काम कर सकता है? आपकी परियोजना के भीतर अतिरिक्त .py फ़ाइलों की आवश्यकता नहीं है।
मैंने इसे fchown के लिए स्वयं दो बार उपयोग किया है ...

+0

वह लिखित के रूप में काम नहीं करेगा। प्रत्येक विधि को @classmethod सजाए गए फ़ंक्शन होना होगा। –

+0

यह क्यों काम नहीं करेगा? मैंने अभी एक वर्ग बनाया है जिसे आप instanciate कर सकते हैं? वहाँ, इसे ठीक किया? – Torxed

+2

आपका संपादित कोड काम करेगा, न कि आपके पिछले संस्करण। –

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