2016-02-16 32 views
9

我在使用接受的答案here的代碼時遇到了問題。爲什麼python的monkeypatch在導入類而不是模塊時不起作用?

代碼的工作取決於我如何導入日期時間。這是爲什麼?是否有可能嘲笑它,所以它可以兩種方式?我正在使用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模塊datetime的絕對參考:test_works()使用的一個。

+0

謝謝,這很有用。那麼,你知道有什麼辦法可以使用「從datetime import datetime」而不是「import datetime」嗎? – rgargente

+1

確定你應該修補'yourmodule.datetime'。看看模擬框架:你可以罰款'補丁'非常有用。 –

+0

我已經爲解決方案創建了一個新答案,但我仍然認爲這是公平的,我將您的答案標記爲已接受。乾杯! – rgargente

6

@Michele d'Amico的答案解釋了爲什麼它不起作用。這是如何使它工作,如果你想使用「從日期時間導入日期時間」而不是「導入日期時間」

monkeypatch.setattr(__name__ + '.datetime', mydatetime) 
相關問題