módulos - modulos python 3
¿Por qué el monopatch de python no funciona cuando se importa una clase en lugar de un módulo? (2)
Estaba teniendo problemas al usar el código de la respuesta aceptada aquí .
El código funciona dependiendo de cómo hago la importación de datetime. ¿Porqué es eso? ¿Es posible burlarse de él para que funcione en ambos sentidos?
Estoy usando Python 3.4
. El siguiente código ilustra el problema:
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
Incluso si no está utilizando el marco mock
, debería echar un vistazo a dónde parchar el capítulo. Por
from datetime import datetime
está creando una nueva referencia de datetime.datetime
en su módulo de prueba y lo llama datetime
: esa es la referencia que usa en la prueba test_doesnt_work()
.
Por
monkeypatch.setattr(''datetime.datetime'', mydatetime)
está datetime
parches a la referencia absoluta de datetime
en el módulo datetime
: el utilizado en test_works()
.
La respuesta de Michele d''Amico explica por qué no funciona. Esta es la forma de hacerlo funcionar si desea usar "desde datetime import datetime" en lugar de solo "import datetime"
monkeypatch.setattr(__name__ + ''.datetime'', mydatetime)