2016-09-17 4 views
3

パッケージの構造:別の名前空間で使用されるクラスを模擬する方法は?

pqr/pq.py 
test.py 

pqr/pq.pyすると、次いる構造

LMNがグローバルにインストールされているPIPモジュール

構造のpq.py

from lmn import Lm 

class Ab(): 

    def __init__(self): 
     self.lm = Lm() 

    def echo(self, msg): 
     print msg 

test.pyは構造

0次があります
from pqr.pq import Ab 

ここではLm()クラスを模擬して、Abクラスのすべてのメソッドをテストしますか?

+1

PythonはMonkey-Patchingをサポートしています。単純に 'pqr.pq.Lm = your_mockup'を呼び出すことができ、' Ab'は元の 'Lm'の代わりに' your_mockup'を使います。 (これはあなたの質問に答えますが、テストのための最良のパターンではないかもしれません。代わりの 'Lm'実装を渡すために' Ab'のコンストラクタを変更することを検討してください) – Phillip

+0

@Phillipはあなたの答えに感謝します。それを完全に取得していない、私はこれの作業のコードスニペットを与えることができます、私はテストフレームワークの初心者です。 – Sanket

答えて

4

Lmがどこから来たかは実際問題ではありません。 Lmpqr.pqという名前空間にグローバルという名前でインポートしたので、その名前を他の場所に置き換えることはできません。これは、Ab.__init__メソッドが自身のモジュール内で 'ローカルに'検索するためです。

import mock 
from pqr.pq import Ab 

with mock.patch('pqr.pq.Lm') as mock_lm: 
    # within this block, `Lm` in the `pqr.pq` namespace has been replaced 
    # by a mock object 
    test_instance = Ab() 
    # assert that the patch succeeded; .return_value is used because 
    # Ab.__init__ *calls* Lm() 
    assert test_instance.lm is mock_lm.return_value 

はまた mockドキュメントの Where to patch sectionを参照してください。

のでmock libraryを使用してすべてを行う必要がある名前pqr.pq.Lmをパッチです。

0

テストのために、mockモジュール(新しいpython 3では標準、古いバージョンではpypiからダウンロード可能)を使用して "偽の"クラスを作成できます。モックライブラリにはこれを行う方法を説明する素晴らしい記事があります。私はhereをリンクしてくれました。あなたのtest.pyファイルは以下のようなものになります。 mockモジュールを使用して

from pqr import pq 
import mock 

class TestLm(unittest.Testcase): 

    @mock.patch(pq.LM) 
    def test_lm(self, mock_lm): 
     my_ab = pq.AB() 
     my_ab.echo() 

、単にあなたの試験方法上記のデコレータでそれを「パッチ適用」によって、あなたは試験方法に使用できるモジュール/クラスのモックバージョンを作成することができます。これにより、指定されたモジュール/クラスの元のバージョンがMagicMockオブジェクトに置き換えられ、テストメソッドに第2引数として渡されます。このMagicMockは実際にはLmの機能を実行しませんが、どのように動作するかについてアサーションを行うことができます。必要に応じて、後で機能を無効にすることができます。しかし、私はリンクされたガイドで説明されているキャッチがあります。 Lmを、使用されているモジュールからインポートする必要があります。従来の方法では使用できません。インポートの場合、Pythonはインポートされるモジュールに固有のモジュールオブジェクトを作成します。そのため、その機能をテストするためにpqモジュールから特定のLmオブジェクトをモックする必要があります。ライブラリは最初は少し複雑で、単一のStackOverflow答えでカバーするのに必要な情報よりはるかに多くの情報が含まれているので、読んでみることをお勧めします。

mockモジュールのマニュアルはhereです。 Python 2.7バージョンのダウンロードはhereです。

私はかなり自分自身mockライブラリに新しいですので、私が間違っている場合私を修正する気軽に!

編集:Martijnの答えを見て、私はmy_abコンストラクタで括弧を忘れてしまったことに気付きました!

関連する問題