2015-09-10 18 views
5

Tôi đang làm việc trên phần mềm cho rô bốt, thường chạy trên Raspberry Pi. Hãy xem xét các hàng nhập khẩu của hai tập tin:python giả và thư viện chưa được cài đặt

motor.py (chạy động cơ):

from RPi import GPIO as gpio 

client.py (giao tiếp với máy chủ và rơle lệnh để động cơ):

from rpi.motor import Motor 

Cả hai file nằm trong một thư mục có tên là rpi, có chứa __init__.py__main__.py. Không thể cài đặt gói RPi trên các thiết bị không phải RPi. Tuy nhiên, tôi vẫn muốn thử nghiệm chức năng của client.py.

import unittest 
from unittest import mock 
# Location A 


class TestClient(unittest.TestCase): 
    # Location B 
    setUp(self): 
     # Location C 
     pass 

Ban đầu, tôi đã cố gắng from rpi.client import Client tại Loca, nhưng điều đó đã thất bại bởi vì nó đã cố gắng để nhập khẩu Motor, và sau đó nhập GPIO từ RPi, mà không tồn tại. Tôi cũng đã cố gắng mock.patch("rpi.client.Motor") tại LocB (bao gồm thêm mock_motor sau self, và nhập khẩu Client tại LocC, nhưng điều đó thất bại là tốt. Tôi đã cố gắng chế giễu RPi tại Loca cũng vậy, nhưng nó đã không làm việc một trong hai.

Làm thế nào để bạn chế nhạo ?. ra một thư viện mà không được cài đặt trên hệ thống của bạn

+0

Nếu thư viện chỉ hoạt động trên Pi, tại sao không chạy thử nghiệm trên Pi? Sau đó, bạn không phải làm bất cứ điều gì phức tạp. – davidism

+0

Bởi vì tôi không có quyền truy cập vào Pi mọi lúc. Tôi phát triển trên máy tính của tôi, và sau đó đẩy đến github và kéo đến Pi. Nhưng tôi thà thử nghiệm trước khi cam kết. –

Trả lời

5

bạn có thể sử dụng patch.dict()sys.modules và giả RPi mô-đun như cho thấy trong tài liệu nhọn

sử dụng theo mã ở trên cùng của mô-đun thử nghiệm của bạn:

>>> from mock import MagicMock, patch 
>>> mymodule = MagicMock() 
>>> patch.dict("sys.modules", RPi=mymodule).start() 
>>> from RPi import GPIO as gpio 
>>> gpio 
<MagicMock name='mock.GPIO' id='139664555819920'> 
>>> import os 
>>> os 
<module 'os' from '/usr/lib/python2.7/os.pyc'> 

Trong Python3 bạn có cùng hành vi.


Trong trường hợp cụ thể, bạn sử dụng patch.dict hơi quá mức; có thể bạn không quan tâm đến bối cảnh vá và khôi phục trạng thái ban đầu. Vì vậy, bạn có thể đơn giản hóa nó bằng cách đặt sys.modules["RPi"] trực tiếp:

>>> from unittest.mock import MagicMock 
>>> mymodule = MagicMock() 
>>> import sys 
>>> sys.modules["RPi"] = mymodule 
>>> from RPi import GPIO as gpio 
>>> gpio 
<MagicMock name='mock.GPIO' id='140511459454648'> 
>>> import os 
>>> os 
<module 'os' from '/usr/lib/python3.4/os.py'> 
+0

Tôi đã xác minh rằng đó là giải pháp đúng. Để làm cho câu trả lời tốt hơn, tôi sẽ mở rộng trên sys.modules. – Dan

+0

Như bạn có thể đọc tại https://docs.python.org/3/library/unittest.mock.html#patch-dict 'patch.dict()' hành vi mặc định duy trì từ điển gốc và chỉ cần tiêm các giá trị mới. Dù sao tôi đã tích hợp câu trả lời của tôi với một số ghi chú khác để làm cho nó rõ ràng hơn. –

Các vấn đề liên quan