2011-12-05 13 views
6

Python turşu "aynı nesne değil" hatalarını görmezden gelmenin bir yolu var mı?Python turşu "yok aynı nesne" hatalarını görmezden gelmenin bir yolu var

datetime.utcnow() üreten sonuçların üzerinde ince taneli kontrole sahip olmak için Mock kullanarak bir test yazıyorum. Kullandığım kod zaman duyarlı olduğundan, mock's yaması test etmeyi kolaylaştırıyor.

Aynı testlerin nesneleri seçmesi ve sonuçları uzak bir sunucuya göndermesi gerekir. Testin amacı için standart bir datetime uzaktan sunucu tarafından alındığı ve alındığı her şey iyi olurdu.

Maalesef turşu modülü aşağıdaki hatayla barfing edilir: Burada

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

hatayı yeniden minimal bir örnektir.

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

ben turşu zaman MockDatetime bir datetime olduğunu düşünerek içine turşu makine kandırabilecek __reduce__ ve __getstate__ yöntemlerden bazıları açılan var mı? belgelerinde where to patch bölümünde baktığımızda

cevap

5

Bu öneri: Bu öneri ardından

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

, ben yerine denedim:

@patch('datetime.datetime', MockDatetime) 

ile:

@patch('__main__.datetime', MockDatetime) 

ve pickle'dan hiçbir hata almadım. Ayrıca, datetime gerçekten yamalı olduğundan emin olmak için bir print deyim ekledim ve beklenen değeri aldım. Birisi turşu için genel bir çözüm istiyor durumda

2

alay: Bu kullanılan mock (örneğin aramalar) iç içeriğini kaydetmek için görünmüyor

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

Not söyledi.

İlgili konular