2016-02-16 4 views
9

У меня возникли проблемы при использовании кода принятого ответа here.Почему monkeypatch python не работает при импорте класса вместо модуля?

Код работает в зависимости от того, как я импортирую дату и время. Почему? Можно ли издеваться над этим, чтобы он работал в обоих направлениях?

Я использую Python 3.4. Следующий код иллюстрирует эту проблему:

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 

ответ

11

Даже вы не используете mock рамки вы должны взглянуть на where to patch главу. По

from datetime import datetime 

вы создаете новую ссылку на datetime.datetime в тестовом модуле и вызовите его datetime: то есть ссылка, что вы используете в test_doesnt_work() тесте.

По

monkeypatch.setattr('datetime.datetime', mydatetime) 

вы заплат datetime «s абсолютную ссылку в datetime модуля: один используется в test_works().

+0

Спасибо, это полезно. Итак, вы знаете какой-либо способ заставить его работать с «из datetime import datetime» вместо «import datetime»? – rgargente

+1

Уверенный, вы должны исправить 'yourmodule.datetime' вместо этого. Взгляните на фрейм фреймворка: вы можете отлично использовать «patch». –

+0

Я создал новый ответ с решением, но я все же думаю, что это справедливо. Я отмечаю ваш ответ как принятый. Ура! – rgargente

6

Ответ @Michele d'Amico объясняет, почему он не работает. Вот как это сделать, если вы хотите использовать «from datetime import datetime» вместо «import datetime»

monkeypatch.setattr(__name__ + '.datetime', mydatetime) 
Смежные вопросы