2016-02-16 11 views
9

Tôi gặp sự cố khi sử dụng mã của câu trả lời được chấp nhận here.Tại sao khỉ con của python không hoạt động khi nhập một lớp thay vì một mô-đun?

Mã hoạt động tùy thuộc vào cách tôi thực hiện nhập ngày giờ. Tại sao vậy? Có thể thử nó để nó hoạt động cả hai cách?

Tôi đang sử dụng Python 3.4. Các mã sau minh họa các vấn đề:

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 

Trả lời

11

Thậm chí bạn không sử dụng mock khuôn khổ, bạn nên có một cái nhìn để where to patch chương. Bởi

from datetime import datetime 

bạn đang tạo một tham chiếu mới của datetime.datetime trong mô-đun thử nghiệm của bạn và gọi nó là datetime: đó là tài liệu tham khảo mà bạn sử dụng trong test_doesnt_work() thử nghiệm.

By

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

bạn đang vá datetime 's tham chiếu tuyệt đối trong datetime mô-đun: Ai sử dụng trong test_works().

+0

Cảm ơn, đó là hữu ích. Vì vậy, bạn có biết cách nào để làm cho nó hoạt động với "từ datetime import datetime" thay vì "datetime import"? – rgargente

+1

Thay vào đó, bạn nên vá 'yourmodule.datetime'. Hãy xem xét khuôn khổ giả: bạn có thể sử dụng 'patch' rất hữu ích. –

+0

Tôi đã tạo ra một câu trả lời mới với giải pháp, nhưng tôi vẫn nghĩ rằng nó công bằng, tôi đánh dấu câu trả lời của bạn là được chấp nhận. Chúc mừng! – rgargente

6

@Michele d'Amico câu trả lời giải thích lý do tại sao nó không hoạt động. Đây là cách làm cho nó hoạt động nếu bạn muốn sử dụng "từ datetime nhập datetime" thay vì chỉ "import datetime"

monkeypatch.setattr(__name__ + '.datetime', mydatetime) 
Các vấn đề liên quan