qué módulos módulo modulos lista importar importa implementa descargar cuando contenido cliente clases bibliotecas python python-3.x mocking py.test monkeypatching

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)