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'> 
  • Django test datei herunterladen - "ValueError: I / O-Operation auf geschlossene Datei"
  • Wie man Firefox-Profil mit Selen umschaltet - ohne einen neuen Treiber zu benennen?
  • Tkinter's event_generate Befehl ignoriert
  • Wie kann ich verhindern, dass Unit-Tests beim Aufruf von webbrowser.open () beenden?
  • Wie gruppiere ich Unit-Tests in Django bei einer höheren Granularität als die App?
  • Überspringen aller Unit-Tests, aber eine in Python mit Dekorateure und Metaklassen
  • Spott eine Steckdose in Python
  • Verwalten von Protokollen / Warnungen in Python-Erweiterungen
  • Wie man Argumente an ein UnitTest ohne globale Variablen sendet
  • Wie kann man die Verbosität in python unittest erhöhen?
  • Erhalten der End-Speicher-Adresse eines Speicherbereichs über Python / Ctypes
  • Python ist die beste Programmiersprache der Welt.