2015-09-10 20 views
5

私は通常、ラズベリーパイで実行されるロボット用のソフトウェアに取り組んでいます。 2つのファイルの輸入を考えてみましょう:Pythonモックとライブラリがインストールされていない

motor.py(モーターを実行します):

from RPi import GPIO as gpio 

client.py(サーバーと通信し、モータにコマンドを中継):

from rpi.motor import Motor 

両方のファイル__init__.py__main__.pyを含むrpiというディレクトリにあります。 RPiパッケージは、非RPiデバイスにはインストールできません。しかし、私はまだclient.pyの機能をテストしたいと思います。

import unittest 
from unittest import mock 
# Location A 


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

もともと、私はLOCAでfrom rpi.client import Clientを試してみましたが、それは存在しないRPI、からGPIOをモーターをインポートし、インポートしようとしたので、それが失敗しました。また、私はあまりにも、LOCAでRPiをからかってみましたが、それはどちらか動作しませんでした。selfmock_motorの追加など(LocBでmock.patch("rpi.client.Motor")を試みたが、10ccのでClientを輸入し、それは同様に失敗しました。

あなたはどのようにモックありませんお使いのシステムにインストールされていないライブラリーアウト

+0

ライブラリがPiでのみ動作する場合は、Piでテストを実行しないでください。そうすれば、何も複雑にする必要はありません。 – davidism

+0

私はいつもPiにアクセスすることができないので。私は自分のコンピュータ上で開発してから、githubにプッシュしてPiにプルします。しかし、私はコミットする前にむしろテストするでしょう。 –

答えて

5

あなたは尖ったマニュアルに示したようsys.modulesとモックRPiモジュールにパッチを適用するpatch.dict()を使用することができます

使用テストモジュールの上部にあるコードに従ってください:?。

>>> 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()'で読めるように、デフォルトの動作は元の辞書を保存して新しい値を注入するだけです。とにかく私は答えをより明確にするために他のノートと一体化しました。 –

関連する問題