2013-04-19 15 views
7

datetime.datetime.now()'un sınama amacıyla belirli bir datetime döndürdüğünden emin olmak isterim. Bunu nasıl yaparım? Ben pytest en monkeypatchYerleşik işlev nasıl maymunlanır datetime.datetime.now?

monkeypatch.setattr(datetime.datetime,"now", nowfunc) 

ile denedim Ama bu hata gösterdiği gibi, bana hata TypeError: can't set attributes of built-in/extension type 'datetime.datetime'

cevap

9

, C de uygulanan birçok uzantı türlerinin özelliklerini monkeypatch olamaz (Diğer Python uygulamaları CPython farklı kurallara sahip olabilirler, ama genellikle benzer kısıtlamalar vardır.)

yolu Bunun etrafında bir alt sınıf oluşturmak ve sınıf. Örneğin

(denenmemiş, ben pytest kullanışlı yok ... Fakat elle monkeypatching ile çalıştığı için):

iyi bir başlangıçtır, ancak o zaman da nowfunc` olduğunu `olduğundan emin olmak için ihtiyaç
class patched_datetime(datetime.datetime): pass 
monkeypatch.setattr(patched_datetime, "now", nowfunc) 
datetime.datetime = patched_datetime 
+0

doğru bağlanmış. İşte py.test için güzel ve eksiksiz bir çözüm: http://stackoverflow.com/questions/20503373/how-to-monkeypatch-pythons-datetime-datetime-now-with-py-test –

1

Yapamazsınız verir. Bunu yapmanız gerekiyorsa, sınanacak kodu, datetime.datetime.now() çağıran bir yardımcı işlevine sahip olacak şekilde değiştirmelisiniz ve bunun yerine bu işleve işaret edecek tüm referansları değiştirmelisiniz. Ardından, seçtiğiniz bir zaman dilimini döndürmek için bu işlevi çalıştırabilirsiniz. Hata anlatır gibi