2011-12-05 14 views
6

Czy istnieje sposób, aby Python Pickle zignorować błędy "to nie ten sam obiekt"?Czy istnieje sposób, aby pyton Python ignorować "to nie ten sam obiekt" błędy

Piszę test za pomocą Mock, aby mieć drobną kontrolę ziarna nad wynikami, które produkuje datetime.utcnow(). Kod, którego używam, jest wrażliwy na zmiany czasu, więc łata próbna ułatwia testowanie.

Te same testy należy zebrać i wysłać wyniki na zdalny serwer. Dla celów testu, jeśli standardowa datetime została pobrana i odebrana przez zdalny serwer, wszystko byłoby w porządku.

Niestety moduł Marynata jest barfing z powodu następującego błędu:

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

Oto minimalne przykład odtworzyć błędu.

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() 

Czy istnieje jakiś combo __reduce__ i __getstate__ metod, które mogą nakłaniać maszyny ogórkowy do myślenia MockDatetime jest datetime kiedy marynowane?

Odpowiedz

5

Patrząc na odcinku w dokumentacji where to patch widzę tę radę:

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

następstwie tego zalecenia, próbowałem wymienić:

@patch('datetime.datetime', MockDatetime) 

z:

@patch('__main__.datetime', MockDatetime) 

i nie dostałem żadnego błędu od pickle. Ponadto dodałem instrukcję print, aby upewnić się, że rzeczywiście została naprawiona datetime, a otrzymałem oczekiwaną wartość.

2

W przypadku gdy ktoś chce rodzajowe rozwiązanie zalewie kpi:

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

Należy pamiętać, że to nie wydaje się, aby zapisać wewnętrzną treść używane mock (np połączenia).

Powiązane problemy