2016-02-16 3 views
9

स्वीकृत उत्तर here के कोड का उपयोग करते समय मुझे समस्याएं आ रही थीं।मॉड्यूल के बजाए कक्षा आयात करते समय पाइथन का बंदरगाह क्यों काम नहीं करता है?

कोड डेटाटाइम के आयात को कैसे करता है इस पर निर्भर करता है। वह क्यों है? क्या यह नकल करना संभव है ताकि यह दोनों तरीकों से काम करे?

मैं Python 3.4 का उपयोग कर रहा हूं।

import pytest 
from datetime import datetime 

mockdate = datetime(2000, 1, 1, 0, 0, 0) 

@pytest.fixture(autouse=True) 
def patch_datetime_now(monkeypatch): 
    class mydatetime: 
     @classmethod 
     def now(cls): 
      return mockdate 

    monkeypatch.setattr('datetime.datetime', mydatetime) 

def test_doesnt_work(): 
    assert datetime.now() == mockdate 

def test_works(): 
    import datetime 
    assert datetime.datetime.now() == mockdate 

उत्तर

11

यहां तक ​​कि आप mock ढांचे उपयोग नहीं कर रहे आप where to patch अध्याय को एक अवलोकन करना चाहिए: निम्नलिखित कोड समस्या को दिखाता है। द्वारा

from datetime import datetime 

आप अपने परीक्षण मॉड्यूल में datetime.datetime का एक नया संदर्भ बनाकर और उसे datetime फोन कर रहे हैं: कि संदर्भ है कि आप test_doesnt_work() परीक्षण में इस्तेमाल करते हैं। test_works() में उपयोग किए गए:

तक

monkeypatch.setattr('datetime.datetime', mydatetime) 

आप datetime के datetime मॉड्यूल में पूर्ण संदर्भ पैचिंग कर रहे हैं।

+0

धन्यवाद, यह उपयोगी है। तो, क्या आप "आयात डेटाटाइम" के बजाय "डेटाटाइम आयात डेटाटाइम से" के साथ काम करने के किसी भी तरीके से जानते हैं? – rgargente

+1

निश्चित रूप से आपको इसके बजाय 'yourmodule.datetime' पैच करना चाहिए। नकली ढांचे के लिए एक नज़र डालें: आप 'पैच' को बहुत उपयोगी बना सकते हैं। –

+0

मैंने समाधान के साथ एक नया जवाब बनाया है, लेकिन मुझे अभी भी लगता है कि यह उचित है कि मैं आपके उत्तर को स्वीकार्य मानता हूं। चीयर्स! – rgargente

6

@ मिशेल डी अमीको का जवाब बताता है कि यह क्यों काम नहीं करता है। अगर आप "आयात डेटाटाइम" के बजाय "डेटाटाइम आयात डेटाटाइम से" का उपयोग करना चाहते हैं, तो यह कैसे काम करना है

monkeypatch.setattr(__name__ + '.datetime', mydatetime) 
संबंधित मुद्दे

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