Làm thế nào để giả định một nhập khẩu, (giả AB)?
Mô-đun A bao gồm nhập B ở đầu.
Dễ dàng, chỉ cần giả lập thư viện trong sys.modules trước khi được nhập:
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
và sau đó, miễn là A
không phụ thuộc vào các loại dữ liệu cụ thể được trả về từ các đối tượng của B:
import A
chỉ nên làm việc
Bạn cũng có thể chế giễu import A.B
:
Điều này hoạt động ngay cả khi bạn có các mô hình con, nhưng bạn sẽ muốn chế giễu từng mô-đun. Nói rằng bạn có điều này:
from foo import This, That, andTheOtherThing
from foo.bar import Yada, YadaYada
from foo.baz import Blah, getBlah, boink
Để giả, chỉ cần thực hiện các thao tác bên dưới trước khi mô-đun chứa phần trên được nhập:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
(Kinh nghiệm của tôi: Tôi đã có một sự phụ thuộc hoạt động trên một nền tảng, Windows, nhưng không hoạt động trên Linux, nơi chúng tôi chạy thử nghiệm hàng ngày. Vì vậy, tôi cần phải chế giễu sự phụ thuộc cho các thử nghiệm của mình. May mắn thay, đó là một hộp đen, vì vậy Tôi không cần phải thiết lập nhiều tương tác.)
Tác dụng phụ nhạo báng
Phụ lục: Thật ra, tôi cần mô phỏng một hiệu ứng phụ mất một thời gian. Vì vậy, tôi cần một phương pháp của một đối tượng để ngủ trong một giây. Điều đó sẽ làm việc như thế này:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
# setup the side-effect:
from time import sleep
def sleep_one(*args):
sleep(1)
# this gives us the mock objects that will be used
from foo.bar import MyObject
my_instance = MyObject()
# mock the method!
my_instance.method_that_takes_time = mock.MagicMock(side_effect=sleep_one)
Và sau đó mã phải mất một thời gian để chạy, giống như phương thức thực.
Mock
sẽ không vá một số thuộc tính ma thuật (__%s__
) như__name__
.