Pythonでモックを正しく使う方法(unittest setUp編
2023-08-15 11:56:54
質問
TDDを学ぶ試みで、ユニットテストとpythonのモックを使用することを学ぼうとしています。 ゆっくりとそのコツをつかんでいますが、これが正しく行われているかどうかは不明です。 予断ですが。ベンダーAPIが2.4のpycファイルとしてプリコンパイルされているので、私はpython 2.4を使うことにこだわっています。
このサンプルコードを 'mymodule.py' に記述します。
import ldap
class MyCustomException(Exception):
pass
class MyClass:
def __init__(self, server, user, passwd):
self.ldap = ldap.initialize(server)
self.user = user
self.passwd = passwd
def connect(self):
try:
self.ldap.simple_bind_s(self.user, self.passwd)
except ldap.INVALID_CREDENTIALS:
# do some stuff
raise MyCustomException
ldap.initializeはldap.ldapobject.SimpleLDAPObjectを返すので、このメソッドでモックアウトしなければならないと思いました。
import unittest
from ldap import INVALID_CREDENTIALS
from mock import patch, MagicMock
from mymodule import MyClass
class LDAPConnTests(unittest.TestCase):
@patch('ldap.initialize')
def setUp(self, mock_obj):
self.ldapserver = MyClass('myserver','myuser','mypass')
self.mocked_inst = mock_obj.return_value
def testRaisesMyCustomException(self):
self.mocked_inst.simple_bind_s = MagicMock()
# set our side effect to the ldap exception to raise
self.mocked_inst.simple_bind_s.side_effect = INVALID_CREDENTIALS
self.assertRaises(mymodule.MyCustomException, self.ldapserver.connect)
def testMyNextTestCase(self):
# blah blah
いくつかの質問につながります。
- 正しく見えますか?)
- これは、私がテストしているクラス内でインスタンス化されるオブジェクトをモックしようとする適切な方法でしょうか?
- setUpで@patchデコレーターを呼び出してもいいのでしょうか、それとも奇妙な副作用が発生するのでしょうか?
- テストケース・ファイルに例外をインポートすることなく、モックに ldap.INVALID_CREDENTIALS 例外を発生させる方法はありますか?
- 代わりに patch.object() を使用するべきですか、また、そうであれば、どのように使用しますか?
ありがとうございます。
どのように解決するのですか?
あなたは
patch()
を関数デコレータとしてだけでなくクラスデコレータとしても使用できます。そして、モック化した関数を先ほどと同じように渡すことができます。
@patch('mymodule.SomeClass')
class MyTest(TestCase):
def test_one(self, MockSomeClass):
self.assertIs(mymodule.SomeClass, MockSomeClass)
ご覧ください。 すべてのテストメソッドに同じパッチを適用する (また、代替案もリストアップされています)
すべてのテストメソッドに対してパッチを適用したい場合は、setUp でこのようにパッチャーを設定するのがより理にかなっています。
関連
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonでファイルやフォルダを削除する方法は?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】典型的なテストディレクトリ構造でunittestを実行する
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] Python 言語を決定するには?
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] 新しいpip backtrackingの実行時問題の解決
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。