2011-12-05 8 views
6

क्या अजगर अचार को "यह वही वस्तु नहीं है" त्रुटियों को अनदेखा करने का कोई तरीका है?क्या पाइथन अचार को "यह वही वस्तु नहीं है" त्रुटियों को अनदेखा करने का कोई तरीका है

मैं डॉकटाइम .utcnow() उत्पादन के परिणामों पर ठीक अनाज नियंत्रण रखने के लिए मॉक का उपयोग करके एक परीक्षण लिख रहा हूं। मैं जिस कोड का उपयोग कर रहा हूं वह समय संवेदनशील है इसलिए नकली पैच परीक्षण करना आसान बनाता है।

समान परीक्षणों को वस्तुओं को चुनने और परिणामों को दूरस्थ सर्वर पर भेजने की आवश्यकता होती है। परीक्षण के उद्देश्य के लिए यदि रिमोट सर्वर द्वारा एक मानक डेटाटाइम उठाया गया और प्राप्त किया गया तो सबकुछ ठीक होगा।

दुर्भाग्य से अचार मॉड्यूल निम्न त्रुटि के साथ barfing है:

Can't pickle <type 'datetime.datetime'>: it's not the same object as datetime.datetime

यहाँ त्रुटि पुन: पेश करने के लिए एक न्यूनतम उदाहरण है।

from mock import patch 
from datetime import datetime 
import pickle 

class MockDatetime(datetime): 
    frozendt = datetime(2011,05,31) 

    @classmethod 
    def advance(cls, **kw): 
    cls.frozendt = cls.frozendt + timedelta(**kw) 

    @classmethod 
    def utcnow(cls): 
    return cls.frozendt 

@patch('datetime.datetime', MockDatetime) 
def test(): 
    pickle.dumps(datetime.utcnow()) 

if __name__ == '__main__': 
    test() 

वहाँ __reduce__ और __getstate__ तरीकों कि सोच जब मैं अचार MockDatetime एक datetime है में अचार मशीनरी चाल सकता है कुछ कॉम्बो है?

उत्तर

5

दस्तावेज में where to patch अनुभाग को देखते हुए मैं इस सलाह देखें:

The basic principle is that you patch where an object is used, which is not necessarily the same place as where it is defined.

इस सिफारिश के बाद, मैं बदलने के लिए कोशिश की है:

साथ
@patch('datetime.datetime', MockDatetime) 

:

@patch('__main__.datetime', MockDatetime) 

और मुझे pickle से कोई त्रुटि नहीं मिली। इसके अलावा, मैंने यह सुनिश्चित करने के लिए कथन जोड़ा है कि datetime वास्तव में पैच किया जा रहा था और मुझे अपेक्षित मूल्य मिला।

2

मामले में किसी को अचार के लिए एक क्रियाशील समाधान चाहता है का मजाक उड़ाता है:

m = mock.MagicMock() 
m.__reduce__ = lambda self: (mock.MagicMock,()) 

ध्यान दें कि यह प्रयोग किया जाता है नकली (उदाहरण, कॉल) के आंतरिक सामग्री को बचाने के लिए प्रतीत नहीं होता।

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

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