Pythonschock und Bibliotheken, die nicht installiert sind

Ich arbeite an Software für einen Roboter, der normalerweise auf dem Raspberry Pi läuft. Betrachten wir die Importe von zwei Dateien:

motor.py (läuft die motor.py ):

 from RPi import GPIO as gpio 

Und client.py (kommuniziert mit dem Server und leitet Befehle an die Motoren):

 from rpi.motor import Motor 

Beide Dateien befinden sich in einem Verzeichnis namens rpi , das ein __init__.py und ein __main__.py . Das RPi Paket kann nicht auf Nicht-RPi-Geräten installiert werden. Allerdings möchte ich noch die Funktionalität von client.py .

 import unittest from unittest import mock # Location A class TestClient(unittest.TestCase): # Location B setUp(self): # Location C pass 

Ursprünglich habe ich versucht from rpi.client import Client bei LocA, aber das ist gescheitert, weil es versucht, Motor zu importieren, und dann importieren GPIO aus RPi, die nicht existiert. Ich habe auch versucht, mock.patch("rpi.client.Motor") bei LocB (einschließlich Hinzufügen mock_motor nach self , und importiert Client bei LocC, aber das scheiterte RPi versuchte verspotten RPi bei LocA auch, aber es nicht Arbeit auch.

Wie verspotst du eine Bibliothek, die nicht auf deinem System installiert ist?

One Solution collect form web for “Pythonschock und Bibliotheken, die nicht installiert sind”

Sie können patch.dict() , um RPi zu patch und das RPi Modul zu verspotten, wie in spitzen Dokumentationen gezeigt.

Verwenden Sie den folgenden Code an der Oberseite Ihres Testmoduls:

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

In Python3 hast du das gleiche Verhalten.


In Ihrem speziellen Fall verwenden Sie patch.dict ist etwas übertrieben; Vielleicht interessierst du dich nicht für Patch-Kontext und originellen Zustand. So kannst du es durch set sys.modules["RPi"] direkt vereinfachen:

 >>> 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'> 
  • Prüfen Sie, ob eine Funktion eine Warnung mit Nasentests auslöst
  • Spott eine Steckdose in Python
  • Bei der Verwendung von unittest.mock.patch, warum ist autospec nicht true standardmäßig?
  • Django Benutzer Setup für Nase Tests
  • Wie benutzt man ein Befehlszeilenargument in unittest?
  • Einheit testet ganze Projekthierarchie in Python mit unittest in pydev
  • Python spöttische globale Variable
  • Warum könnte dieser Code eventuell einen Testfall ausfallen?
  • Python ist die beste Programmiersprache der Welt.