2017-03-21 2 views
0

pytestを使って単純なアプリケーションを設定する最良の方法についてアドバイスを受けたいと思っていました。pytestでエラーが発生した単純なpythonアプリケーションを設定するNameErrorとAttributeError

私は、単一のファイルにpytest罰金を実行することができますが、私は使用してPythonアプリケーションをブートストラップしたい:/

NameError: name 'func' is not defined 

にmypkg:

mypkg/ 
    __init__.py 
    app.py 
tests/ 
    __init__.py 
    test_app.py 

をしかし、私はpytestを実行すると、私はエラーを取得します__init__.pyファイル

# content of __init__.py 
# Empty init file 

にmypkg/app.pyファイル

# content of app.py 
class mypkg: 
    def func(x): 
     return x + 1 

テスト/ __ init__.pyファイル

# content of __init__.py 
# Empty init file 

テスト/ test_app.pyファイル

# content of test_app.py 
import pytest 
import mypkg 

def test_answer(): 
    assert func(4) == 5 

私は、Pythonを使用しています3.5。

setup.pyが必要ですか?代わりにmypkg.func(4)を呼び出すと、AttributeError: module mypkg has no attribute 'func'と表示されます。

ご迷惑をおかけして申し訳ありません。

答えて

2

この質問はpytestとは全く関係がありません。 Pythonでは、名前にアクセスする場合は、インポートする必要があるという基本的なルールです。 funcをインポートしていないため、名前の誤りがあります。

ただし、何らかの理由でfuncをクラスの一部として定義しました。クラスとは別にメソッドをインポートすることはできません。しかし、の理由はありません。これは、クラス内のメソッドであることが全くありません。スタンドアローン関数として定義し、インポートします。

funcは、の内部にあり、mypkgの内部にはありません。したがって、実際にどこにインポートする必要があります。

from mypkg.app import func 
+0

おかげでダニエルを次のようにテストを書き換える必要があり、mypkg/app.pyモジュール内に常駐mypkgクラス内funcを宣言したことにmypkgとアプリ=の間の期間ディレクトリmypkg/app。また、私はクラスを削除し、メソッドが今一人で立っている。 –

0

あなたは:)私は今理解ので、あなたが

# content of test_app.py 
import pytest 
import mypkg 

def test_answer(): 
    obj = mypkg.app.mypkg() 
    assert obj.func(4) == 5 
関連する問題