2015-09-10 2 views
5

Я работаю над программным обеспечением для робота, который обычно запускается на малине Pi. Рассмотрим импорт двух файлов:python mock и библиотеки, которые не установлены

motor.py (запускает двигатели):

from RPi import GPIO as gpio 

и client.py (обменивается данными с сервером и реле команды на двигатели):

from rpi.motor import Motor 

Оба файла находятся в каталоге rpi, который содержит __init__.py и __main__.py. Пакет RPi не может быть установлен на устройствах, отличных от RPi. Тем не менее, я все еще хочу проверить функциональность client.py.

import unittest 
from unittest import mock 
# Location A 


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

Изначально я пытался from rpi.client import Client на Loca, но это не удалось, потому что он пытался импортировать двигатель, а затем импортировать GPIO из RPI, который не существует. Я также попытался mock.patch("rpi.client.Motor") в LocB (включая добавление mock_motor после self и импортирован Client на LOCC, но это не удалось, как хорошо. Я попытался насмешливо RPi на Лока, тоже, но это не сработало.

Как ты глумился ?. из библиотеки, который не установлен в вашей системе

+0

Если библиотека работает только на Pi, то почему бы не запустить тесты на Pi? Тогда вам не нужно ничего осложнять. – davidism

+0

Потому что у меня нет доступа к Pi в любое время. Я развиваюсь на своем компьютере, а затем нажимаю на github и тяну к Pi. Но я скорее испытаю, чем совершу. –

ответ

5

Вы можете использовать patch.dict() залатать sys.modules и напускной RPi модуль, как показано в остроконечной документации

Использование следовать код в верхней части тестового модуля:

>>> 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'> 

В Python3 у вас такое же поведение.


В вашем конкретном случае использования patch.dict является немного излишним; возможно, вас не интересует контекст патча и восстановление исходного состояния. Таким образом, вы можете упростить его набор sys.modules["RPi"] непосредственно:

>>> 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

Я проверял, что это правильное решение. Чтобы лучше ответить, я расширил бы sys.modules. – Dan

+0

Как вы можете прочитать на https://docs.python.org/3/library/unittest.mock.html#patch-dict 'patch.dict()' поведение по умолчанию сохраняет исходный словарь и просто вводит новые значения. В любом случае я включил свой ответ с некоторыми другими заметками, чтобы сделать его более понятным. –

 Смежные вопросы

  • Нет связанных вопросов^_^