python मॉड्यूल के बजाय एक वर्ग को आयात करते समय अजगर का बंदरपैच काम क्यों नहीं करता?




python-3.x mocking (2)

स्वीकार्य उत्तर के कोड का उपयोग करते समय मुझे समस्याएं आ रही थीं

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

मैं 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

यहां तक ​​कि आप mock ढांचा का उपयोग नहीं कर रहे हैं, आपको उस पर ध्यान देना चाहिए जहां से पैच अध्याय होना चाहिए। द्वारा

from datetime import datetime

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

द्वारा

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

आप datetime मॉड्यूल में datetime पूर्ण संदर्भ पट्टी कर रहे हैं: test_works() में उपयोग किया गया


@ एमिले डी'आमिको का जवाब बताता है कि यह काम क्यों नहीं करता है यह काम करने के तरीके हैं यदि आप "आयात समय-समय" के बजाय "दैट-टाइम आयात डेट-टाइम" से उपयोग करना चाहते हैं

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